首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >$$phase in AngularJS是什么?

$$phase in AngularJS是什么?
EN

Stack Overflow用户
提问于 2013-11-28 10:09:19
回答 5查看 27.5K关注 0票数 42

我发现了这个代码片段,它是某个人为引导模式编写的角指令的一部分。

代码语言:javascript
运行
复制
//Update the visible value when the dialog is closed                                                                                                                                                                                                            
                //through UI actions (Ok, cancel, etc.)                                                                                                                                                                                                                         
                element.bind("hide.bs.modal", function () {                                                                                                                                                                                                                     
                    scope.modalVisible = false;                                                                                                                                                                                                                                 
                    if (!scope.$$phase && !scope.$root.$$phase)                                                                                                                                                                                                                 
                        scope.$apply();                                                                                                                                                                                                                                         
                });  

我理解这一部分是双向绑定的后半部分,我们绑定到hide.bs.modal事件,并在UI更改时更新模式。

我只是想知道为什么在调用apply之前,这个人要检查$$phase的范围和rootScope?

我们不能马上打电话申请吗?

$$phase在这里是什么?

我找了很多遍,找不到任何好的解释。

编辑:

我找到了我看到的例子: 引导模态的简单角度指令

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-28 10:16:39

$$phase是一个标志集,而角是一个$digest循环。

有时(在罕见的情况下),您希望在执行$$phase之前检查作用域上的$apply。如果尝试在$apply期间执行$digest,则会发生错误。

错误:$apply已经在进行中

票数 48
EN

Stack Overflow用户

发布于 2014-02-06 18:54:45

达文是完全正确的,这是一个旗帜,角设置在消化周期。

,但不要在代码中使用它.

最近,我有机会询问Misko (角作者)关于$$phase的情况,他说永远不要使用它;它是摘要周期的内部实现,未来是不安全的。

为了确保您的代码在将来继续工作,他建议在$timeout中包装任何您想要“安全应用”的内容。

代码语言:javascript
运行
复制
$timeout(function() {
  // anything you want can go here and will safely be run on the next digest.
})

当您有回调或在摘要周期中可能解决的其他事情时(但不要总是这样),就会出现这种情况。

下面是我在处理google的一个库时的一个示例片段:(其余的服务已经中断)。

代码语言:javascript
运行
复制
window.gapi.client.load('oauth2', 'v2', function() {
    var request = window.gapi.client.oauth2.userinfo.get();
    request.execute(function(response) {
        // This happens outside of angular land, so wrap it in a timeout 
        // with an implied apply and blammo, we're in action.
        $timeout(function() {
            if(typeof(response['error']) !== 'undefined'){
                // If the google api sent us an error, reject the promise.
                deferred.reject(response);
            }else{
                // Resolve the promise with the whole response if ok.
                deferred.resolve(response);
            }
        });
    });
});

请注意,$timeout的延迟参数是可选的,如果未设置,默认为0 ($timeout调用$browser.defer哪个如果没有设置延迟,默认为0)

有点不直观,但这是男人写角度的答案,所以对我来说已经足够好了!

票数 37
EN

Stack Overflow用户

发布于 2013-12-02 01:30:11

在该示例中,元素绑定将从非角事件执行。在大多数情况下,只调用$apply()而不检查阶段是安全的。

但是,如果您查看代码的其余部分,就会看到一个名为$scopeshowModal()函数。该函数调用非角度代码,这可能会导致"hide.bs.modal“事件触发。如果事件通过此路由触发,则调用堆栈位于$digest中。

因此,这个事件确实属于由角托管代码和非角代码调用的函数的罕见情况。在本例中,检查$$phase是必要的,因为您不知道事件是如何产生的。如果将$$phase设置为某样东西,那么摘要循环就会完成,并且不需要调用$apply()

这种模式通常被称为“安全适用”

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

https://stackoverflow.com/questions/20263118

复制
相关文章

相似问题

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