出于某种原因,我的解析函数中的 $rootScope.user
变量在我的 view.html
模板加载之前没有完成数据分配。
大多数时候,我将能够在我的模板中执行 {{ $root.user.uid }}
并且我将能够看到变量数据,但有时它不会'不要出现。
我对为什么会发生这种情况感到有点困惑,因为在模板加载之前不需要先运行解决方案吗?
有人知道为什么会这样吗?
注意:如果我在 deferred.resolve();
之前添加一个 console.log($rootScope.user.uid)
它总是显示出来,只是不显示模板中的变量。
.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 }
})
})
请注意: Controller 中没有任何内容。这是专门让我的 $rotoScope 到模板。
最佳答案
您的解决方案未返回 promise ,因此在解决时您的 workflow_item_auth 可能未设置。如果您的 resolve 返回一个 promise ,它不会导航到您的 View ,直到它被解决。
$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;
});
}
}
}
);
编辑 - 事实上我看到你在那里返回一个 promise 。我仍然认为那里可能存在时间问题。我仍然会像上面解释的那样去做。
关于javascript - Angularjs $rootScope 解析有时不在模板中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38643223/