ng-switch不会自动更新

时间:2013-05-24 11:54:07

标签: javascript angularjs haml

我遇到ng-switch的异常行为,我无法弄明白。在我的页面顶部,我有

#content{"ng-switch" => "root.showAlert"}
  %div.alert.ng-cloak#alert{"ng-switch-when" => "true"}
    {{root.alert.message}}
    %div.close
      %a{:href => "#", "ng-click" => "dismissAlert()"}
        =image_tag "icons/icon-close-black.png"

在我的一个控制器中(最高级别)我有以下操作

$scope.displayAlert = function(message) {
  $scope.root.alert = {
    message: message
  };
  $scope.root.showAlert = true;

  if (!$scope.$$phase) {
    $rootScope.$digest();
  }
}

$ scope.root在$ rootScope中定义,因此可以访问所有内容。

当我将root.showAlert标志更改为true时,我希望看到警报出现,因为它应该正在观看此变量,但它不会立即发生,而是在我更改其他内容时显示应用程序通过执行任何其他操作。

通过添加我的$rootScope.$digest(),它可以立即显示,但我想知道它为什么不自行完成?

放还:

$rootScope.dismissAlert = function() {
  $scope.root.showAlert = false;
  delete $scope.root.alert;
}

1 个答案:

答案 0 :(得分:2)

如果对digest()的调用导致UI中的某些内容发生变化,否则就会发生变化,这意味着影响该UI的数据正在某些异步代码或其他未执行的代码中被更改。 AngularJS自己的背景。

在Angular的内置功能(ng-click$http回调等)中发生的所有主要操作都会调用scope.$apply(进而调用scope.$digest)在整个系统中传播变化的相关范围。如果要从Angular的“世界”之外更改代码,则需要将功能包装在scope.$apply(或调用scope.$digest)中,以便自己完成。

在这种情况下,Angular可能会在连接按钮的范围内运行摘要,但由于您在 root 范围内调用了数据,因此需要启动自己消化。

有关详细信息,请参阅this answer in Databinding in AngularJS