首頁  >  問答  >  主體

angular.js - angularjs 傳輸資料問題

有什麼方法在載入控制器前先從服務端取得某些資料?從而在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...

我想大声告诉你我想大声告诉你2713 天前420

全部回覆(3)我來回復

  • 高洛峰

    高洛峰2017-05-15 17:11:07

    額...這樣? have a try,個人第一直覺,不知道好使不= =面向直覺編程,錯了勿怪哈

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

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-15 17:11:07

    額,正常點的。

    返回promise对象,不要返回data,直接return $http.get(xxx);

    後面調用factory的時候直接。

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

    非常規思路,以前幹過...

    1. 在factory給個回調方法參數,在請求完成後,呼叫回調,把userInfo放到參數中。

    2. 加上一個$watch,在有值後(change會觸發,記得要判斷不為空,貌似初始化的時候也會觸發watch),進行處理。記得處理完後後刪除watch,呼叫後會回傳var unwatch = $watch()的方法,直接unwatch();執行就好了。

    3. 發送事件(在factory應該行不通)? 。

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-15 17:11:07

    不知道你是否知道promise?
    $http.get() 方法會回傳一個promise,不懂Googlepromise的話先是一種思路:

    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);
            });
        }]);

    回覆
    0
  • 取消回覆