我不知道这是不是一个好习惯,但是我希望我的整个Angular网站上都有一个全局的模型对象。
我可以使用angular.constant
来存储我的全局模型对象,但是我想要填充的数据来自后端,因此需要HTTP请求才能使用相关数据填充它。
目前,我在angular.run
填充此全局模型,但angular.run
实际上是在加载控制器和指令后执行的,因此如果指令需要来自全局模型的数据,则会失败。
在任何指令或控制器激活之前,是否有更好的地方可以引导数据填充?和/或我可以延迟激活控制器和指令的方式,直到我的HTTP请求以某种方式完成?
有关此主题的任何想法或建议将不胜感激!
答案 0 :(得分:0)
这正是ui-router
分辨率的用途。如果您正在使用angulars默认路由系统抛出并使用ui-router
(严重这是每个人都使用的)。
在定义状态时,您需要为根状态创建分辨率。如果加载,则必须在状态本身之前解析分辨率。
$stateProvider.state('app', {
resolve: {
user: function($stateParams, $http) {
return $http.get('/users/' + $stateParams.userId);
}
}
}).state('app.userProfile', {}); // Can't enter this state until the parent resolutions are resolved.
使用分辨率时,它们可作为控制器中的注射剂使用。因此,如果您的app.userProfile
状态使用用户对象,则在实例化该控制器时,它将作为可注入状态提供。
app.controller('UserProfileController', function($scope, user) {
$scope.user = user; // Pretty cool!
});
决议非常灵活。你可以让决议等待其他决议。
$stateProvider.state('app.userProfile.posts', {
resolve: {
threads: function($http) {
return $http.get('users/' + $stateParams.userId + '/threads');
},
posts: function(threads, $http) {
// Threads has to resolve before this resolution starts
}
}
});
决议可立即返回值或使用承诺。如果使用了promise,则在实例化控制器之前,状态转换将一直等到它被解析。
希望这就是你要找的东西!
答案 1 :(得分:0)
不是最好的方法,但是如果你对角度有点不熟悉并且不想立即进入路由......你可以在控制器内的全局模型上设置$watch
,所以执行angular.run
后,您将获得一个回调,您可以在其中处理可用数据。
类似
$scope.$watch(variable, function(){
//process
});
其中variable是范围变量,最终用数据填充(可能在$http.success
)