出于某种原因,我的解析函数中的$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 }
})
})
答案 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);
}
}
})})