Angularjs $ rootScope在解析时有时不会在模板中更新

时间:2016-07-28 17:38:08

标签: javascript angularjs angular-ui-router

出于某种原因,我的解析函数中的$rootScope.user变量在我的view.html模板加载之前没有完成分配数据。

大多数情况下,我可以在模板中执行{{ $root.user.uid }},我将能够看到变量数据,但有时它不会显示。

我对为什么会发生这种情况感到有点困惑,因为在模板加载之前没有必须先运行FIRST?

有谁知道为什么会发生这种情况?

注意:如果我在console.log($rootScope.user.uid)之前添加deferred.resolve();,则会始终显示,只是不在模板中显示变量。

.factory('Auth', function($http, $state, $q, $rootScope) {
    var factory = {workflowItemCheck: workflowItemCheck };
    return factory;

   function workflowItemCheck(workflow_id) { return $http.post('/auth/workflow', {workflow_id:workflow_id}); }
})


.config(function($stateProvider, $urlRouterProvider, $locationProvider) {
    var workflow_item_auth = ['$q', 'Auth', '$rootScope', '$stateParams', function ($q, Auth, $rootScope, $stateParams) { 

        var deferred = $q.defer();

        Auth.workflowItemCheck($stateParams.workflow_id).then(function(data){ 
            $rootScope.user = { uid: data.data.uid };
            deferred.resolve(); 
        }, function(){ deferred.reject(); });

        return deferred.promise;
    }];


    $stateProvider.state(
        'workflow2.view', { 
            url: '/:workflow_id/view', 
            templateUrl: 'pages/templates/workflow/view.html',
        }, 
        controller: 'workflow.view', 
        resolve: { authenticated: workflow_item_auth } 
    })



})

请注意:控制器中没有任何内容。这是专门让我的$ rotoScope到模板。

3 个答案:

答案 0 :(得分:3)

您的决定是否未返回承诺,因此在解析您的workflow_item_auth时可能无法设置。如果您的决议返回了一个承诺,那么它将无法导航到您的视图,直到它被解决。

$stateProvider.state(
        'v1', {
            url: '/:workflow_id/view',
            templateUrl: 'view.html',
            resolve: {
                authenticated: function(Auth, $rootScope, $stateParams) {
                    return Auth.workflowItemCheck($stateParams.workflow_id).then(function(data) {
                        $rootScope.user = {uid: data.data.uid};
                        return data;
                    });
                }
            }
        }
);

编辑 - 实际上我看到你在那里回复了一个承诺。我仍然认为那里可能存在时间问题。我仍然会这样做,如上所述。

答案 1 :(得分:0)

因为后端调用是异步的,所以我相信Angular在你的后端调用完成时已经完成了它的摘要周期。因此,绑定不会更新。

在你的诺言的决心(你在哪里做$ rootScope.user = ..),尝试添加$ rootScope。$ apply()之后,刷新绑定。

答案 2 :(得分:0)

我得到了一个解决方案,即在将数据加载到视图之前执行解析。 众所周知,如果控制器返回一个promise,它将在控制器之前执行。并且在查看之前执行控制器。

希望这可以给你一种帮助

.controller('workflow.view', ['$rootScope', 'authUser', function($rootScope, authUser){
$rootScope.user = { uid: authUser.data.uid };}])

.config(function($stateProvider, $urlRouterProvider, $locationProvider) {
$stateProvider.state(
    'workflow2.view', { 
        url: '/:workflow_id/view', 
        templateUrl: 'pages/templates/workflow/view.html',
    }, 
    controller: 'workflow.view', 
    resolve: { 
        Auth : 'Auth',
        authUser: function(Auth,$stateParams){
           return Auth.workflowItemCheck($stateParams.workflow_id);
        }
    } 
})})