这是我关于SO的第一个问题。
当我在作用域上拼接数组元素时,在bootbox.js的回调中完成时,不会反映该更改。
使用:
$scope.deleteA = function() {
if (confirm("Really delete Item 3?")) {
$scope.itemsA.splice(2, 1);
}
}
不起作用:
$scope.deleteB = function() {
bootbox.confirm("Really delete Item 3?", function(answer) {
if (answer === true) {
$scope.itemsB.splice(2, 1);
}
});
}
我主要对理解为什么感兴趣。这对我来说比拥有一个花哨的解决方案更重要。
答案 0 :(得分:7)
角度范围变量从角度的ouside世界发生任何变化,没有亲密的角度消化系统来运行摘要周期来更新绑定。
在bootbox
回调角度中,不知道某些内容会发生变化,这就是为什么不更新视图的原因
要解决此问题,您需要使用$apply
method或$timeout
service手动启动摘要周期,这样
bootbox.confirm("Really delete Item 3?", function(answer) {
if (answer === true) {
$scope.$apply(function(){
$scope.itemsB.splice(2, 1);
});
}
});
答案 1 :(得分:0)
应用范围更改的安全方法是使用$timeout
服务。
bootbox.confirm("Really delete Item 3?", function(answer) {
if (answer === true) {
$timeout($scope.itemsB.splice(2, 1));
}
});
所以你不必担心$digest
阶段而你的$apply
将是一个高调用堆栈,请看AngularJS Wiki - Anti-Patterns点-2。
不要做
if (!$scope.$$phase) $scope.$apply()
,这意味着你的 <{1}}在调用堆栈中不够高。