【问题标题】:Prevent controller to start, if $rootScope.projects is undefined?阻止控制器启动,如果 $rootScope.projects 未定义?
【发布时间】:2015-06-25 12:30:59
【问题描述】:

我在 Angular 应用程序的 app.run 部分发送 HTTP 请求。但问题是使用$rootScope.projects 的控制器是在$rootScope.projectsHTTP 请求创建和填充之前启动的。

如果$rootScope.projects 未定义,如何防止控制器加载?

这是我的HTTP 请求:

$http({method : 'GET', url:'https://api.parse.com/1/classes/Project', 
        headers: { 'X-Parse-Application-Id':ParseID, 'X-Parse-REST-API-Key':ParseREST}})
    .success(function(res) {
        $rootScope.projects = res.results;
    })
    .error(function(err) {
        console.log(err);
        $rootScope.projects = [];
    }); 

【问题讨论】:

  • 你在使用ui-router吗?如果是这样,resolve 在控制器实例化之前会想到做这样的事情
  • 在 AJAX 回调中检索到服务器端数据后,您可以手动引导 Angular 应用程序:blog.mariusschulz.com/2014/10/22/…
  • 您也可以将项目变量初始化为一个空数组。

标签: javascript angularjs asynchronous


【解决方案1】:

使用ng-controller 时,您无法控制控制器实例化时间。使用一次性手表

var initWatcher = $rootScope.$watch('projects', function (newVal, oldVal) {
  if (newVal !== oldVal) {
    initWatcher();
    // init further 
  }
})

在控制器中 - 或在 $rootScope 上发出 'init' 事件并监听它。

如果 ngRoute/ui-router 是这种情况,你可以使用 route 的 resolve,它就是专门用于此类事情的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 2016-03-05
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多