$在settimeout中申请



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。

相关内容

  • 没有找到相关文章

最新更新