2

我创建了一个指令,用于监视day属性并在属性值更改时检索远程资源。咖啡脚本代码:

angular.module('app.directives').directive 'myDirective', ['$timeout', ($timeout)->

    DirectiveController=($scope, activityResource)->

        # Load activities
        load= ()->
            activityResource.get {
                day: $scope.day
                environment_id: $scope.environment.id
            },
            (data)->
                $scope.activities = data.activities

        # Watch environment and reload activities
        $scope.$watch 'environment', (value) ->
            load()

        # Watch selected day to reload activities
        $scope.$watch 'day', (value) ->
            load()
...
]

load每次更改时都会调用该方法,day但不会触发结果回调。网络检查显示请求没有发送到远端。我发现的唯一解决方法是load使用服务推迟执行该方法$timeout

        $scope.$watch 'day', (value) ->
            $timeout (()-> load()), 10

我怀疑与范围生命周期有关的问题,但我无法弄清楚为什么我必须推迟对资源的调用。

更新

资源源代码:

resources = angular.module('app.resources', ['ngResource'])

...

resources.factory 'app.activityResource', ['$resource', 'app.endpoint', ($resource, endpoint)->
  $resource "#{endpoint()}/user/environments/:environment_id/activities/:id/:verb",
  {environment_id: "@environment_id", id: "@id"},
  latest:
    method : 'GET'
    params:
      verb: 'latest'
  annual:
    method : 'GET'
    params:
      verb: 'annual'
]

我还在代码摘录中添加了第二个观察属性 ( environment),用作查询资源的参数。

更新 2

我不知道它是否相关,但我们正在使用 CORS 访问远程端(这似乎运作良好)。

4

1 回答 1

1

您没有看到请求被触发的原因是,作为 $http 调用的一部分,配置作为承诺传递给每个拦截器。

https://github.com/angular/angular.js/blob/b99d064b6ddbcc9f59ea45004279833e9ea82928/src/ng/http.js#L665-L670

在 Angular 中,$q 承诺仅在 $digest 循环开始时解决。因此,在 $digest 循环发生之前,您的 HTTP 请求甚至不会被触发,这就是为什么您看到将 $timeout 包装在它周围会有所帮助(超时会导致 $digest )。

https://github.com/angular/angular.js/blob/2a5c3555829da51f55abd810a828c73b420316d3/src/ng/q.js#L160 https://github.com/angular/angular.js/blob/3967f5f7d6c8aa7b41a5352b12f457e2fbaa251a/src/ngrootScope/ .js#L503-L516

您还可以通过重新创建您看到的错误条件并查看网络请求来验证这一点。运行此程序后,您应该会看到您的请求被触发:

angular.element( "[ng-app]" ).scope().$digest()

该代码在 $rootScope 上触发 $digest 循环,导致您未解决的承诺得到解决。

请参阅此问题以进行更多讨论,因为我同意这是令人惊讶的行为。

https://github.com/angular/angular.js/issues/2881

于 2013-07-29T21:36:24.913 回答