gpt4 book ai didi

javascript - $scope.$watch 未调用,但 $digest 已在进行中

转载 作者:行者123 更新时间:2023-11-29 22:09:45 25 4
gpt4 key购买 nike

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

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

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

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

我试图通过在调用 ctrl.loadData() 和实际 loadData 方法,但收到此错误:

$digest already in progress

查看文档,这似乎是正确的,因为当我们进行这些调用时我们仍然在 Angular 上下文中(我们在服务中使用 ngResource,所以它没有调用一些 jQuery 上下文或任何东西奇怪的)。我似乎无法在填充数据后对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com