加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 角度$scope $apply vs $timeout作为安全$apply

发布时间:2020-12-17 09:00:03 所属栏目:安全 来源:网络整理
导读:我试图更好地理解在Angular中使用$ timeout服务作为一种“安全$ apply”方法的细微差别。基本上在一段代码可以响应于Angular事件或非角事件(例如jQuery或一些标准DOM事件)运行的情况下。 据我所知: 在$ scope中包装代码。$ apply适用于你的场景 都不在摘要
我试图更好地理解在Angular中使用$ timeout服务作为一种“安全$ apply”方法的细微差别。基本上在一段代码可以响应于Angular事件或非角事件(例如jQuery或一些标准DOM事件)运行的情况下。

据我所知:

>在$ scope中包装代码。$ apply适用于你的场景
都不在摘要循环(也称为jQuery事件),但如果摘要正在进行,则会引发错误
>在没有延迟参数的$ timeout()调用中包装代码无论是否已经在摘要周期中

看看Angular源代码,看起来像$ timeout会调用$ rootScope。$ apply()。

>为什么如果一个摘要周期已经在进行,$ timeout()也会引发一个错误?
>是最好的做法是使用$ scope。$ apply()当你知道一个摘要不会已经在进行和$ timeout()当需要它是安全的吗?
>是$ timeout()真的是一个可接受的“安全应用”,还是有gotchas?

感谢任何洞察。

Looking at Angular source code,it looks like $timeout makes a call to
$rootScope.$apply().

  • Why doesn’t $timeout() also raise an error if a digest cycle is already in progress?

$ timeout使用一个未记录的Angular服务$ browser。具体来说,它使用$ browser.defer(),通过window.setTimeout(fn,delay)异步执行你的函数,它总是在Angular生命周期之外运行。只有一次window.setTimeout已经触发你的函数将$ timeout调用$ rootScope。$ apply()。

  • Is the best practice to use $scope.$apply() when you know for sure that a digest won’t already be in progress and $timeout() when needing it to be safe either way?

我会这样说。另一个用例是,有时你需要访问一个$ scope变量,你知道只有在digest之后才初始化。简单的例子是如果你想在控制器构造函数中设置一个窗体的状态为dirty(无论什么原因)。没有$ timeout FormController没有被初始化并发布到$ scope上,所以在$ timeout内包装$ scope.yourform.setDirty()可以确保FormController已经初始化。当然你可以做一个指令没有$超时,只是给另一个用例的例子。

  • Is $timeout() really an acceptable “safe apply”,or are there gotchas?

它应该总是安全的,但你的方法应该总是目标为$ apply()在我看来。我目前工作的Angular应用程序是相当大,我们只需要依赖$ timeout一次,而不是$ apply()。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读