如何在加载控制器和指令之前在Angular中创建/填充全局模型?

时间:2015-09-16 14:33:02

标签: angularjs

我不知道这是不是一个好习惯,但是我希望我的整个Angular网站上都有一个全局的模型对象。

我可以使用angular.constant来存储我的全局模型对象,但是我想要填充的数据来自后端,因此需要HTTP请求才能使用相关数据填充它。

目前,我在angular.run填充此全局模型,但angular.run实际上是在加载控制器和指令后执行的,因此如果指令需要来自全局模型的数据,则会失败。

在任何指令或控制器激活之前,是否有更好的地方可以引导数据填充?和/或我可以延迟激活控制器和指令的方式,直到我的HTTP请求以某种方式完成?

有关此主题的任何想法或建议将不胜感激!

2 个答案:

答案 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