angular.js - angularjs 传输数据问题
我想大声告诉你
我想大声告诉你 2017-05-15 17:09:07
0
3
449

有什么方法在加载控制器前先从服务端得到某些数据?从而在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...

我想大声告诉你
我想大声告诉你

répondre à tous(3)
小葫芦

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

 $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;
                        })
                    });
            
Ty80

Euh, c'est normal.

Retourpromise对象, ne renvoie pas de données, juste return $http.get(xxx);

Directement lors de l'appel à l'usine plus tard.

factory.func().then(data) {
    //你的逻辑
}

Idée non conventionnelle, je l'ai déjà fait...

  1. Donnez un paramètre de méthode de rappel dans l'usine. Une fois la demande terminée, appelez le rappel et mettez userInfodans le paramètre.

  2. 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 directement unwatch();.

  3. 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 :

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);
        });
    }]);
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal