Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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 ng开关未自动更新_Javascript_Angularjs_Haml - Fatal编程技术网

Javascript ng开关未自动更新

Javascript ng开关未自动更新,javascript,angularjs,haml,Javascript,Angularjs,Haml,我在使用ng开关时遇到了一个我无法理解的异常行为。在我的页面顶部,我有 #content{"ng-switch" => "root.showAlert"} %div.alert.ng-cloak#alert{"ng-switch-when" => "true"} {{root.alert.message}} %div.close %a{:href => "#", "ng-click" => "dismissAlert()"}

我在使用
ng开关时遇到了一个我无法理解的异常行为。在我的页面顶部,我有

#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;
}
如果对
digest()
的调用导致用户界面中的某些更改,而这些更改在其他情况下不会发生,则意味着影响该用户界面的数据正在某些异步代码中更改,或者某些其他代码没有从AngularJS自己的上下文中执行

Angular内置功能中发生的所有主要操作(
ng单击
$http
回调等)调用
范围。$apply
(反过来调用
范围。$digest
)在相关范围内传播更改。如果要从Angular的“世界”之外更改代码,则需要将功能包装在
范围内。$apply
(或调用
范围。$digest
)自行完成

在本例中,Angular可能正在连接按钮的作用域上运行摘要,但由于您正在更改根作用域上的数据,您需要自己启动摘要


有关更多信息,请参阅。

请提供dismissAlert()函数。我敢打赌,您访问了错误的范围。不过,我在解除警报时没有问题,只是在显示警报时。但正如我所说,它是显示的,它只需要一个显式的摘要调用,或者其他一些操作就可以运行。不过,如果能看到实际的HTML,那就太好了。如果你可以发布HTML而不是haml,也许会有更多的用户能够提供帮助。第二:angular正在处理html结果,如果haml在这一点上做了一些奇怪的事情,我不知道。啊,好的,这是有道理的。因此,我的
displayAlert
是从一个websocket消息的回调调用的,我猜这是不可能的。所以在这里,我应该将调用包装在一个作用域中。$apply?刚刚测试了一下,它工作得很好:)我假设因为我的回调在一个角度控制器中,所以会很好,但我完全忘记了该方法是从作用域外调用的,因此它不知道。现在工作:D