2

day属性を監視し、属性値が変更されるたびにリモート リソースを取得するディレクティブを作成しました。CoffeeScript コード:

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 番目の監視属性 ( ) をコードの抜粋に追加しました。

更新 2

関連しているかどうかはわかりませんが、CORS を使用してリモート エンドにアクセスしています (これはうまく機能しているようです)。

4

1 に答える 1

1

リクエストが発生していない理由は、 $http 呼び出しの一部として、設定が promise として各インターセプターに渡されるためです。

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

angular では、 $q promise は $digest サイクルの開始時にのみ解決されます。その結果、HTTP リクエストは $digest サイクルが発生するまで起動されません。そのため、 $timeout をラップすると役立つことがわかります (タイムアウトにより $digest が発生します)。

https://github.com/angular/angular.js/blob/2a5c3555829da51f55abd810a828c73b420316d3/src/ng/q.js#L160 https://github.com/angular/angular.js/blob/3967f5f7d6c8aa7b41a5352b12f457e2fbaa251aroot/ng スコープ.js#L503-L516

表示されているエラー状態を再現し、ネットワーク リクエストを監視することで、これを確認することもできます。これを実行すると、リクエストが発火するのがわかります。

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

そのコードは $rootScope で $digest サイクルを起動し、未解決の promise を解決します。

これは驚くべき動作であることに同意するので、詳細についてはこの問題を参照してください。

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

于 2013-07-29T21:36:24.913 に答える