首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >$apply in setTimeout

$apply in setTimeout
EN

Stack Overflow用户
提问于 2014-01-31 04:19:26
回答 2查看 4K关注 0票数 0

我知道$apply用来连接Javascript上下文和AngularJS上下文。

下面是一个简单的例子:

模板:

代码语言:javascript
运行
复制
<div>{{someVal}}</div>

控制器中的javascript:

代码语言:javascript
运行
复制
setTimeout(function() {
    scope.$apply(function(){scope.someVal = 123});
}, 1000);

在上述情况下,我们需要使用$apply

第一题:

如果我将上面的javascript修改为:

代码语言:javascript
运行
复制
setTimeout(function() {
    scope.someVal = 123;
}, 1000);

scope.$watch('someVal', function(val) {
    console.info(someVal);
});

没有关于someVal修改为123的控制台..。为什么?我们不能看在超时回调中修改的表达式吗?

第二个问题:

如果使用ngSwitch指令,如下所示:

代码语言:javascript
运行
复制
<div ng-switch on="sub">
    <div ng-switch-when="a">
//state a
    </div>
    <div ng-switch-when="b">
//state b
    </div>
</div>

当我修改控制器中的sub时:

代码语言:javascript
运行
复制
scope.sub = 'a';
setTimeout(function() {
    scope.sub = 'b';
}, 1000);

不需要使用$apply!为什么?

我发现ngSwitch指令使用$watch来监视on属性值。为什么ngSwitch可以查看超时回调中修改的作用域属性?

请告诉我以上两句话的原因。

EN

回答 2

Stack Overflow用户

发布于 2014-01-31 04:30:49

您可以使用$timeout作为window.setTimeout的包装器,也可以通过这种方式在回调中不需要使用$apply:

$timeout(函数(){ scope.someVal = 123;},1000);

当你运行外部的代码时,你需要一种方法让这个值的角度和观察者知道它已经改变了。这就是$apply的目的,它将允许观看侦听器触发。

关于您的第二个问题,关于,为什么范围在没有$apply的情况下进行更新,您应该以某种方式间接触发$apply/$文摘。为了给你一个更具体的答案,一个柱塞将是必要的,以检查您的代码正在进行的其他内容。

票数 1
EN

Stack Overflow用户

发布于 2014-01-31 04:26:35

使用Angularjs $timeout服务而不是setTimeout,您将不需要$apply。同样的情况是,如果使用jquery调用,请使用角http服务来避免使用$apply。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21472327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档