我知道$apply用来连接Javascript上下文和AngularJS上下文。
下面是一个简单的例子:
模板:
<div>{{someVal}}</div>控制器中的javascript:
setTimeout(function() {
scope.$apply(function(){scope.someVal = 123});
}, 1000);在上述情况下,我们需要使用$apply。
第一题:
如果我将上面的javascript修改为:
setTimeout(function() {
scope.someVal = 123;
}, 1000);
scope.$watch('someVal', function(val) {
console.info(someVal);
});没有关于someVal修改为123的控制台..。为什么?我们不能看在超时回调中修改的表达式吗?
第二个问题:
如果使用ngSwitch指令,如下所示:
<div ng-switch on="sub">
<div ng-switch-when="a">
//state a
</div>
<div ng-switch-when="b">
//state b
</div>
</div>当我修改控制器中的sub时:
scope.sub = 'a';
setTimeout(function() {
scope.sub = 'b';
}, 1000);不需要使用$apply!为什么?
我发现ngSwitch指令使用$watch来监视on属性值。为什么ngSwitch可以查看超时回调中修改的作用域属性?
请告诉我以上两句话的原因。
发布于 2014-01-31 04:30:49
发布于 2014-01-31 04:26:35
使用Angularjs $timeout服务而不是setTimeout,您将不需要$apply。同样的情况是,如果使用jquery调用,请使用角http服务来避免使用$apply。
https://stackoverflow.com/questions/21472327
复制相似问题