超时调用时,角度双向绑定不起作用
作者:互联网
因此,我有一个HTML模板,其中包含以下角度表达式{{player.score}}.存储在范围对象中的播放器的初始分数会在表达式的位置正确呈现.
现在,我有一个按钮,单击该分数需要更新.如果我简单地用硬编码值更新球员得分,则它可以正常工作:
$scope.updateScore = function (){
$scope.player.score = 1000; //this is updated without any issues
};
但是我的问题是我的球员得分是一个复杂的计算,需要我使用_.defer.因此,当我将我的早期代码(用于测试)包装在_.defer中时,它不起作用:
$scope.updateScore = function (){
_.defer(function() {
$scope.player.score = 5000; //this is not updated...
});
};
我了解_.defer的方式只是setTimeout的下划线包装.我希望无论_.defer使用什么延迟,当它最终更新分数时,由于Angular双向绑定,它将在HTML中得到体现.
但这仅在使用_.defer时才发生,否则它会按预期工作. _.defer也在更新Angular对象,因为如果我在延迟的代码中执行console.log(player.score),那么在控制台中几秒钟后,我确实会看到更新分数(5000).
任何语言/ Javascript专家都可以帮助我理解我做错了什么以及如何解决.请注意,由于各种技术/传统原因,删除_.defer并不是真正的选择.
我只是想弄清楚为什么当以延迟方式更新对象时,Angular不更新视图.
任何指针,不胜感激.
解决方法:
Angular不会“知道”此延迟,因此即使值被更新,它也不会出现在视图中,直到下一个摘要循环.
您可以将$timeout注入您的控制器并像这样使用它:
_.defer(function() {
$timeout(function() {
$scope.player.score = 5000; //this is not updated...
});
});
您还应该阅读有关斜角对象的延迟对象(https://docs.angularjs.org/api/ng/service/ $q)
标签:html5,angularjs,underscore-js,javascript,jquery 来源: https://codeday.me/bug/20191119/2033949.html