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