我对$scope.$watch
有疑问在调用检索我的数据模型后没有得到评估。我会解释一下,但对于不耐烦的人来说,也许你可以根据这个 fiddle 弄清楚发生了什么:http://jsfiddle.net/ADukg/3964/ .
在我们的 Angular 项目中,我们让一些指令构建自己的数据模型,有时也会传递给其他包含的指令。在本例中,构建自己模型的指令是 myMessages
,其数据传递到的指令是 myObjects
.
myMessages
指令依赖于名为 messageManager
的服务随时获取与其相关的消息(在我们的代码中,这是基于诸如 $routeParams
值之类的内容,例如 http://localhost/messages/34
)。对于我的例子,我只是忽略了参数并直接传回数据。
有趣的是,如果我注释掉第 55 行和第 68 行(包装 setTimeout
调用),这段代码可以“正常”工作(我把它放在引号中,因为,嗯,我真的不确定它是否是实际上是否使用了良好的做法)。但是,保留调用以模拟 HTTP 请求, objects
的值myObjects
中的范围变量指令的link
方法为空,针对该变量设置的监视在 2 秒后无法运行。
我试图通过显式调用$scope.$apply
来欺骗 watch 重新评估都调用ctrl.loadData()
和实际的loadData
里面方法,但收到此错误:
$digest already in progress
浏览文档,似乎这是正确的,因为当我们执行这些调用时,我们仍然在 Angular 上下文中(我们在服务中使用 ngResource,所以它不会调用某些 jQuery 上下文或任何东西)奇怪的)。我似乎无法让 watch 对抗 objects
填充数据后重新评估的变量,无论我尝试什么(包括将 $scope.$watch
函数的第三个参数设置为 true
)。
任何帮助将不胜感激。
最佳答案
您应该使用 $timeout
而不是 setTimeout
,因为 $timeout
将触发摘要周期以使数据在绑定(bind)中可用。
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;
}
};
});
关于javascript - $scope.$watch 未调用,但 $digest 已在进行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18690698/