搜尋

首頁  >  問答  >  主體

angular.js - 如何用angular的run來儲存使用者資料?

我想透過run來設定一個$rootScope.userinfo,然後不同頁裡面也可以透過$rootScope.userinfo來取得目前使用者的資訊而不需要再去伺服器抓取,但是現在遇到了挺多問題。
第一次我在run中直接$http然後設定$rootScope.userinfo=response,然後在各個controller當中透過$scope.userinfo=$rootScope.userinfo來將這個userinfo抓取到當前scope中使用,但是出現了undefined的問題;
第二次我在run中使用broadcast

        $rootScope.$broadcast("thisintheuserinfo", response);

然後再在controller裡面使用$on

$scope.$on("thisintheuserinfo",
        function (event, msg) {
            if(msg){
                //$scope.usernamea = msg.user;
                console.log('123')
                console.log(msg)
            }
            else{
                alert(msg)
            }

        });

但是出現了$on的function中的程式碼幾乎從來不會運行的問題,似乎是因為run中的那個是異步的,controller的on在broadcast開始前就開始了?無論如何,反正也是錯的多對的少。
所以不知道各位有什麼好的方法可以給我借鏡?

怪我咯怪我咯2831 天前818

全部回覆(1)我來回復

  • 怪我咯

    怪我咯2017-05-15 17:09:45

    基本上滿足要求,可能有一丟丟副作用.

    var app = angular.module('myApp', []);
    
    app.factory('User', function($q, $timeout){
        var userInfo, 
            loading, 
            deferred = $q.defer(),
            promise  = deferred.promise;
    
        return {
            getUserInfo: function(){
    
                if(!loading){
                    loading = true;
                    // 模拟http请求
                    console.log('发起请求...')
                    $timeout(function(){
                        userInfo = {
                            name: 'Angularjs',
                            version: '1.x'
                        };
                        deferred.resolve(userInfo);
    
                    }, 100);
    
                    return promise;
    
                }else if( userInfo ){
                    console.log('这是缓存的信息');
                    return $q.resolve(userInfo);
                }else{
                    console.log('正在等待请求的结果...');
                    return promise;
                }
            }
        }
    });
    
    app.controller('MyCtrl',function($scope, User, $timeout){
        User.getUserInfo().then(function(userInfo){
            console.log('run:',userInfo);
            $scope.name = userInfo.name;
        });
    });
    
    app.run(function(User){
        User.getUserInfo().then(function(userInfo){
            console.log('controller:',userInfo);
        });
    })

    回覆
    0
  • 取消回覆