Javascript 使用超时调用时角度双向绑定不起作用
所以我有一个HTML模板,里面有下面的角度表达式Javascript 使用超时调用时角度双向绑定不起作用,javascript,jquery,angularjs,html,underscore.js,Javascript,Jquery,Angularjs,Html,Underscore.js,所以我有一个HTML模板,里面有下面的角度表达式{{player.score}。存储在scope对象中的玩家的初始分数正确地呈现在表达式的位置 现在,我有一个按钮点击这个分数需要更新。如果我简单地用硬编码的值更新玩家分数,它将正常工作: $scope.updateScore = function (){ $scope.player.score = 1000; //this is updated without any issues }; 但我的问题是,我的球员得分是一个复杂的计算,这
{{player.score}
。存储在scope对象中的玩家的初始分数正确地呈现在表达式的位置
现在,我有一个按钮点击这个分数需要更新。如果我简单地用硬编码的值更新玩家分数,它将正常工作:
$scope.updateScore = function (){
$scope.player.score = 1000; //this is updated without any issues
};
但我的问题是,我的球员得分是一个复杂的计算,这需要我使用\uuu.defer
。因此,当我将早期代码(用于测试)包装在\uu.defer
中时,它不起作用:
$scope.updateScore = function (){
_.defer(function() {
$scope.player.score = 5000; //this is not updated...
});
};
我对\uuu.defer
的理解只是在setTimeout
的包装下加下划线。我希望在\uu.defer
使用任何延迟之后,当它最终开始更新分数时,由于角度双向绑定,它将反映在HTML中
但这并不是只有在使用了\uu.defer
时才会发生的,否则它会按预期工作。另外,\uu.defer
正在更新角度对象,因为如果我在延迟代码中执行console.log(player.score)
,那么在控制台中几秒钟后,我确实会看到更新分数(5000)
任何angular/Javascript专家都能帮助我理解我所做的错误以及如何修复它。请注意,由于各种技术/传统原因,删除\uuu.defer
实际上不是一个选项
我只是想弄明白为什么当对象以延迟方式更新时,角度不会更新视图
非常感谢任何指针。Angular不“知道”此延迟,因此即使值得到更新,它也不会出现在视图中,直到下一个摘要循环。
您可以将其注入控制器并如下使用:
_.defer(function() {
$timeout(function() {
$scope.player.score = 5000; //this is not updated...
});
});
您还应该阅读angular($q)中的延迟对象。
\uq。延迟将代码带出angular摘要的范围,因为它在内部调用setTimeout
您需要手动启动延迟函数内的摘要,以便在该点重新绑定,使用:
或者您需要将回调保持在角度范围内,可能是通过使用(但请记住将$timeout
注入控制器/指令):
我会优先选择选项2,我个人不知道如何使用.defer
,但这当然取决于你。不应该player.score
是$scope.player.score
?是的,它是-player.scope是一个打字错误。.defer()
不会触发摘要周期。您应该在为范围分配新内容后“手动”执行此操作。或者,您也可以使用$timeout
,它无论如何都可以做到这一点。@guidokiting:您能给我一个在我的特定用例中如何做到这一点的示例吗?非常感谢在\uu.defer()
中分配任务后尝试使用$scope.$apply()
$scope.updateScore = function (){
_.defer(function() {
player.score = 5000;
$scope.$apply();
});
};
$scope.updateScore = function (){
$timeout(function() {
player.score = 5000;
}, 1); // or 0, but _.defer passes 1
};