2

スコープにいくつかのものを設定するマスターコントローラーのようなものがあるので、内部コントローラーはそれを使用できます。

そのセットアップ作業は非同期なので、promise でラップしましたが、既に解決されていない限り、コールバックを実行していません (ブレークポイントを設定しようとしましたが、十分に待機すると、実際にthenコールバックが実行されます)。

これは、ネットワーク要求ではなくタイムアウトで私の問題を再現するフィドルです: http://jsfiddle.net/LMv8v/1/

HTML

<div ng-app>
    <div ng-controller="configController">
        <div ng-controller="testC">
            {{test}}
            {{foo}}
        </div>
    </div>
</div>

Javascript

function configController ($scope, $q) {
    var deferred = $q.defer();
    $scope.config = deferred.promise;

    setTimeout(function() {
        console.log('timeout');
        deferred.resolve({
            'foo' : 'baz'
        });
    }, 1000);
};

function testC($scope) {
    $scope.test = 'I am working, uh?';
    $scope.config.then(function(config) {
        console.log('then...');
        $scope.$apply(function() {
            $scope.foo = config.foo;
        });
    });
};

timeout」は表示されますが、「then...」メッセージは表示されません。

(これがサービスに適していることはわかっていますが、ネストされたスコープを持つコードがすでにたくさんあり、リファクタリングを開始する前にそれを機能させたいと考えています)

4

1 に答える 1

2

あなたが使用している場合$.getJSON()(私が推測しているjQueryから)

Angular の世界の外で何かを解決している場合、同様の問題が発生します。次のことを試してください。

$.getJSON('ajax/test.json', function(data) {
   $scope.$apply(function(){
      deferred.resolve({
            'foo' : 'baz'
      });
  });
});

jQuery ajax を使用した jsfiddle の例

于 2013-06-18T17:42:17.057 に答える