Angular $ scope在bootbox回调中不会更新

时间:2016-03-19 10:03:57

标签: javascript angularjs angularjs-scope bootbox ng-boot-box

这是我关于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);
      }
    });
}

我主要对理解为什么感兴趣。这对我来说比拥有一个花哨的解决方案更重要。

I created a Plunker to show the effect

2 个答案:

答案 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}}在调用堆栈中不够高。