2

我有一个类似于主控制器的东西,可以在范围内设置一些东西,所以内部控制器可以使用它。

该设置工作是异步的,所以我将它包装在一个承诺中,但它不会执行它的回调,除非它已经解决(我尝试设置一个断点,如果我等待足够多,它实际上会运行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;
        });
    });
};

它显示“超时”,但不显示“然后... ”消息。

(我知道这将更适合服务,但我已经有很多嵌套范围的代码,我想在开始重构之前让它工作)

4

1 回答 1

2

如果您正在使用$.getJSON()(我猜来自 jQuery)

您将遇到类似的问题,您正在解决 Angular 世界之外的问题,请尝试以下操作。

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

带有 jQ​​uery ajax 的 jsfiddle 示例

于 2013-06-18T17:42:17.057 回答