Rumah > Soal Jawab > teks badan
有什么方法在加载控制器前先从服务端得到某些数据?从而在controller中能保证得到值?(头大,黑线···)
定义了一个factory gData如下
angular.module('myapp', ['user'])
.factory('gData', function ($http) {
//$rootScope该怎么用????
var data = {
userInfo:{}
};
$http.get('user/getProfile', {})
.then(function (r) {
console.log(r.data); //这是console1
if(r.data.status == 1) {
data.userInfo.userId = r.data.data['user'].id;
data.userInfo.name = r.data.data['user'].name;
data.userInfo.group_id = r.data.data['user'].groups[0].id;
data.userInfo.supervisor_id = r.data.data['user'].groups[0].supervisor_id;
}
});
console.log(data);//这是console2
return data;
})
由于异步加载,console2先于1执行,所以返回的空值。
//请假条controller,user model中
.controller('AskforLeaveController', [
'$scope',
'UserService',
'$filter',
'gData',
function ($scope, UserService,$filter,gData) {
console.log(gData.userInfo); //有值
console.log(gData.userInfo.userId);//undefind
UserService.askLeaveInfo.user_id = gData.userInfo.userId; //失败,undefind!!!!how can I do
UserService.askLeaveInfo.supervisor_id = gData.userInfo.supervisor_id; //失败,undefind
//...
求解啊,该怎么处理???(哭)各种方法弄两天了
还有个问题,myapp下定义的$rootScope在user下的controller里居然也提示我undefind...
高洛峰2017-05-15 17:11:07
Em... macam ni? cubalah, naluri pertama saya, saya tidak tahu apa yang perlu dilakukan = = Program untuk gerak hati, jangan salahkan saya jika anda salah
$http.get('user/getProfile', {})
.then(function (r) {
console.log(r.data); //这是console1
if(r.data.status == 1) {
data.userInfo.userId = r.data.data['user'].id;
data.userInfo.name = r.data.data['user'].name;
data.userInfo.group_id = r.data.data['user'].groups[0].id;
data.userInfo.supervisor_id = r.data.data['user'].groups[0].supervisor_id;
}.then(function(){
console.log(data);//这是console2
return data;
})
});
PHP中文网2017-05-15 17:11:07
Kembalikanpromise对象
, jangan pulangkan data, hanya return $http.get(xxx);
Terus bila call kilang nanti.
factory.func().then(data) {
//你的逻辑
}
Berikan parameter kaedah panggil balik di kilang Selepas permintaan selesai, panggil panggilan balik dan letakkan userInfo
dalam parameter.
Tambah $watch dan proses selepas ada nilai (perubahan akan mencetuskan, ingat untuk menyemak jika ia tidak kosong, nampaknya jam tangan juga akan dicetuskan semasa pemula). Ingat untuk memadam jam tangan selepas pemprosesan Kaedah akan kembali var unwatch = $watch()
selepas memanggilnya terus unwatch();
.
Hantar acara (tidak sepatutnya bekerja di kilang)? .
我想大声告诉你2017-05-15 17:11:07
Saya tidak tahu sama ada anda tahu janji?
Kaedah $http.get() akan mengembalikan janji Jika anda tidak faham janji, sila google dahulu
Berikut ialah idea:
angular.module('myapp', ['user'])
//创建service
.service('user.service', function($http,$q) {
var userInfo = null;
return {
getUserInfo: function () {
return $q(function (resolve) {
if (userInfo) {
resolve(userInfo);
}else {
$http.get('/user/getProfile', {}).then(function (resp) {
userInfo = {
userId:resp.data.user.id,
name:resp.data.user.name,
group_id:resp.data.groups[0].id,
supervisor_id:resp.data.groups[0].supervisor_id,
};
resolve(userInfo);
});
}
});
}
};
})
//使用这个service
.controller('xxx',['user.service',function (service) {
service.getUserInfo().then(function (userInfo) {
console.log(userInfo);
});
}]);