2

$scope.$watch在调用检索我的数据模型后,我遇到了一个未得到评估的问题。我会解释一下,但对于不耐烦的人,也许你可以根据这个小提琴弄清楚发生了什么:http: //jsfiddle.net/ADukg/3964/

在我们的 Angular 项目中,我们让一些指令构建自己的数据模型,有时也会将其传递给其他包含的指令。在这种情况下,构建自己的模型myMessages的指令是 ,其数据传递到的指令是myObjects

myMessages指令依赖于一个被调用的服务messageManager来随时获取与其相关的消息(在我们的代码中,这是基于诸如$routeParams值之类的东西,例如,http://localhost/messages/34)。对于我的示例,我只是忽略了参数并直接将数据传回。

有趣的是,如果我注释掉第 55 行和第 68 行(包装setTimeout调用),这段代码可以“正常”工作(我把它放在引号中,因为,我真的不确定它是否真的使用了良好的做法)。但是,将调用保留在那里以模拟 HTTP 请求,指令方法中objects范围变量的值是空的,并且针对该变量设置的监视在 2 秒后无法运行。myObjectslink

我试图通过在实际方法$scope.$apply的调用周围和内部显式调用来欺骗手表重新评估,但收到此错误:ctrl.loadData()loadData

$digest 已经在进行中

查看文档,似乎这是正确的,因为当我们进行这些调用时,我们仍然在 Angular 上下文中(我们在服务中使用 ngResource,所以它不会调用一些 jQuery 上下文或任何奇怪的东西)。objects无论我尝试什么(包括将$scope.$watch函数的第三个参数设置为),我似乎都无法在填充数据后重新评估变量的值true

任何帮助将不胜感激。

4

1 回答 1

2

您应该使用$timeout而不是setTimeout因为$timeout将触发摘要循环以使数据在绑定中可用。

myApp.factory('messageManager', function ($q, $timeout) {
    return {
        getMessages: function () {
            var deferred, promise;

            deferred = $q.defer();
            promise = deferred.promise;

            $timeout(function () {
                deferred.resolve({
                    messages: [{
                        firstName: 'Sam',
                        lastName: 'Rockwell',
                    }, {
                        firstName: 'Nat',
                        lastName: 'Faxon',
                    }, {
                        firstName: 'Jim',
                        lastName: 'Rash'
                    }]
                });
            }, 2000);

            return promise;
        }
    };
});
于 2013-09-09T02:59:06.857 回答