【问题标题】:Prevent controller from running before HTTP request is fulfilled?防止控制器在 HTTP 请求完成之前运行?
【发布时间】:2015-04-13 18:51:40
【问题描述】:
$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams){
    if ($rootScope.carNameMap) {
        _import.stateEvent.changeTitle(toState, toParams, event);
    } else {
        _import.getCompanies.init().then(function(res){ //<-- promise
            _import.stateEvent.changeTitle(toState, toParams, event);
        });
    }
});

如您所见,在我的 $stateChangeStart 中,我检查 carNameMap 是否已经创建,如果没有,我运行一个发送 HTTP 请求并返回承诺的服务。

但是当我有一个远程数据库时,我的控制器在http request 结束之前运行。

如何防止控制器在 HTTP 请求完成之前运行?

【问题讨论】:

    标签: javascript angularjs http promise


    【解决方案1】:

    您应该查看 angularJs 在配置块的 $routeProvider 中提供的解析功能:

    app.config(function ($routeProvider) {
      $routeProvider
        .when('/',
        {
          templateUrl: "app.html",
          controller: "AppCtrl"
          resolve: {
            foo: function ($q) {
                //your logic goes here, and then your controller will receive an "foo" parameter.
            }
          }
        }
      )
    });
    

    【讨论】:

    • 好的,如果我需要它出现在每个视图上怎么办?
    • 如果每个视图都需要解析同一个调用,您可以将函数移动到所有视图共享的范围内,例如 'foo: myResolveFunction'
    • 所以没有办法让它在$stateChangeStart事件中工作?
    • 我认为常见的状态使用相同的控制器,所以如果您在具有多个状态的控制器中使用解析,它应该适用于所有状态,但我不确定。
    最近更新 更多