【问题标题】:Execute service before AngularJS bootstrap在 AngularJS 引导之前执行服务
【发布时间】:2014-10-26 09:02:42
【问题描述】:

目前我想知道,是否有可能执行一个额外的服务来执行异步调用并在当前范围内绑定响应,然后引导我的应用程序。

我需要这种行为,因为我想从服务器获取一些数据并将其绑定到范围。我尝试了一些解决方案(比如 ui-router 组件中的 resolve 方法),但我仍然无法解决。

另外我想避免使用 $watch 方法来观察变量。

谁有这个问题的解决方案?

提前致谢。

【问题讨论】:

  • 为什么不让控制器启动 $http 并在成功时填写范围变量?
  • 查看这个问题的答案stackoverflow.com/questions/16286605/…
  • 感谢您的回答。问题是这不适用于指令 - 任何人都有解决方案?

标签: javascript angularjs resolve


【解决方案1】:

没有编写自己的手动引导程序,您不能在 Angular 引导之前使用服务。但你为什么需要?您可以在 angular 引导后简单地获取数据,例如就像 Marvin Smit 在 cmets 中提到的那样,在您的控制器中获取它:

function MyCtrl($http, $scope) {
    $http.get('whatever')
    .then(function success(response) {
        $scope.stuff = response.data
    })
}

Angular 的指令和插值在编写时考虑到了这一点,如果在执行控制器时没有定义$scope.stuff,则不会出错。

或者你可以使用 ngRoute/ui-router 和路由的 resolve 参数(见https://docs.angularjs.org/api/ngRoute/provider/$routeProvider

【讨论】:

  • 是的,这是我目前的实现,几乎适用于所有情况。问题在于,我在几个指令中都有这个获取信息的条件,并且这些指令是在异步请求执行之前执行的。
  • 但这并不能真正解释为什么如果数据丢失,这些指令不能有默认行为。此外,您仍然可以使用解析。如果你不想这样做,你可以编写一个“解析器”指令,它首先等待数据,然后编译它的模板。
  • 然后我会尝试更详细地解释我的意图。我有一个简单的指令,它注入一个 UserService 来检索有关 currentUser 的信息,比如他的名字或他的 UserRoles。我的指令应该根据他的 UserRole 加载一个单独的模板。当我从我的指令在 templateUrl 函数中注入 mit UserService 时,我要求 UserService.IsUserRoleTypeFoo() 然后我将得到一个未定义的返回,因为在执行指令时,来自我的 UserService.init() 方法的异步调用没有执行.
  • 当我在我的 ApplicationController 中实现一个承诺时,该指令会加载模板而无需等待异步调用执行。特别要提到的是,我想实现一个完整的无状态应用程序,所以我只想在客户端保存我的不记名令牌。
  • 没有人有这个打算的解决方案?
猜你喜欢
  • 2016-10-31
  • 2017-08-23
  • 2013-08-20
  • 2013-12-20
  • 2017-04-09
  • 2014-07-10
  • 1970-01-01
  • 2013-02-05
  • 2020-10-13
相关资源
最近更新 更多