Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用超时调用时角度双向绑定不起作用_Javascript_Jquery_Angularjs_Html_Underscore.js - Fatal编程技术网

Javascript 使用超时调用时角度双向绑定不起作用

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 }; 但我的问题是,我的球员得分是一个复杂的计算,这

所以我有一个HTML模板,里面有下面的角度表达式
{{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
};