有什么方法在加载控制器前先从服务端得到某些数据?从而在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...
Euh... comme ça ? essayez, mon premier réflexe, je ne sais pas quoi faire = = Programme pour l'intuition, ne me blâmez pas si vous vous trompez
Euh, c'est normal.
Retour
promise对象
, ne renvoie pas de données, justereturn $http.get(xxx);
Directement lors de l'appel à l'usine plus tard.
Idée non conventionnelle, je l'ai déjà fait...
Donnez un paramètre de méthode de rappel dans l'usine. Une fois la demande terminée, appelez le rappel et mettez
userInfo
dans le paramètre.Ajoutez un $watch et traitez-le après qu'il y ait une valeur (le changement se déclenchera, pensez à vérifier s'il n'est pas vide, il semble que la montre se déclenchera également lors de l'initialisation). N'oubliez pas de supprimer la montre après le traitement. La méthode reviendra
var unwatch = $watch()
après l'avoir appelée. Exécutez-la simplement directementunwatch();
.Envoyer des événements (ne devrait pas fonctionner en usine) ? .
Je ne sais pas si vous connaissez la promesse ?
La méthode $http.get() renverra une promesse. Si vous ne comprenez pas la promesse, veuillez d'abord la rechercher sur Google
Ce qui suit est une idée :