在我的 Angular.js 应用程序中,我遇到了这样的问题。我有一个名为user
的服务,我在app.run
上调用它来从服务器获取用户数据,如下所示:
app.run(function (user, tracking) {
user.initialize();
... // some other code goes here..
});
这只是调用API路由并创建$rootScope.user
以供所有应用程序使用。
但不知何故,控制器会不时地加载,然后初始化会更快..而$rootScope
里面的user
并不包含function SomeController($scope, $rootScope, $routeParams) {
console.log($rootScope.user.name);
// sometimes returns error -
// TypeError: Cannot read property 'name' of undefined
}
对象。
$rootScope
那么如何在初始化为$watch
之后强制所有控制器加载。我不想在每个控制器中为用户添加{{1}}。'因为它看起来像是错误的决定并且使代码变得丑陋。
你的建议?谢谢!
答案 0 :(得分:3)
我的解决方案是使用resolve
方法的$routeProvider.when()
选项。
这将阻止控制器在数据请求完成之前加载:
$routeProvider.when('/books', {
templateUrl: 'books',
controller: 'bookCtrl',
resolve: {
appUser: function (user) {
// we're injecting "user" service
// and initiliazing it (this method returns $promise)
return user.initialize();
}
}
});
在bookCtrl
里面只注入appUser
作为依赖。
答案 1 :(得分:2)
我遇到了同样的问题。我找到的唯一解决方案是在rootScope中创建一些函数并从控制器中调用它。所以app.run函数有类似的内容:
scope.initUser = function () {
if (!user){
// create
user.initialize();
}
};
然后我的控制器在开始时调用它:
$rootScope.initUser();
不要忘记将$ rootScope注入控制器。
这个解决方案并不是假装优雅,但至少它有效...
如果有人建议更好的解决方案,我将不胜感激......