i konw $apply
用于连接javascript上下文和gangularjs上下文。
一个简单的示例如下:
模板:
<div>{{someVal}}</div>
控制器中的JavaScript:
setTimeout(function() {
scope.$apply(function(){scope.someVal = 123});
}, 1000);
我们需要在上述情况下使用$apply
。
第一个Qustion:
如果我将JavaScript修改为:
setTimeout(function() {
scope.someVal = 123;
}, 1000);
scope.$watch('someVal', function(val) {
console.info(someVal);
});
没有关于将某些VAL修改为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可以观看超时回调中修改的范围属性????
pls告诉我上面两个Qustions的原因。
来自angularjs文档
$ apply()用于从角框架外部执行角度表达式。(例如,来自浏览器DOM事件,Settimeout,XHR或第三方库)。因为我们正在呼吁角度框架,所以我们需要执行适当的例外处理范围生命周期,执行手表。
window.setTimeout是一个JavaScript函数,因此无论您使用setTimeout
>您都必须使用$ apply()才能更新模型。
您的第二个示例没有$apply()
,我已经制作了 demo 来澄清$watch
和$apply
问题。请检查。
您可以使用$ timeout是window.settimeout的包装器,而且您不需要在回调上使用$应用$:
$ timeout(function(){ Scope.Someval = 123;},1000);
当您运行在Angular外部的代码时,您将需要一种方法来让Angular和Watcher的值知道它已更改。多数民众赞成在$申请的目的,它将允许观看听众开火
关于您的第二个问题,为什么范围正在不用$应用而更新,您应该以某种方式间接触发$ apply/$ digest。为了给您一个更具体的答案,需要一个plunker来检查代码上的其他内容。
使用AngularJS $超时服务而不是SetteMeTOut,您将不需要$应用。同样的事情是,如果您使用jQuery HTTP调用,请使用Angular HTTP服务避免使用$ Apply。