我发现了这个代码片段,它是某个人为引导模式编写的角指令的一部分。
//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在这里是什么?
我找了很多遍,找不到任何好的解释。
编辑:
我找到了我看到的例子: 引导模态的简单角度指令
发布于 2013-11-28 10:16:39
$$phase是一个标志集,而角是一个$digest循环。
有时(在罕见的情况下),您希望在执行$$phase之前检查作用域上的$apply。如果尝试在$apply期间执行$digest,则会发生错误。
错误:$apply已经在进行中
发布于 2014-02-06 18:54:45
达文是完全正确的,这是一个旗帜,角设置在消化周期。
,但不要在代码中使用它.
最近,我有机会询问Misko (角作者)关于$$phase的情况,他说永远不要使用它;它是摘要周期的内部实现,未来是不安全的。
为了确保您的代码在将来继续工作,他建议在$timeout中包装任何您想要“安全应用”的内容。
$timeout(function() {
  // anything you want can go here and will safely be run on the next digest.
})当您有回调或在摘要周期中可能解决的其他事情时(但不要总是这样),就会出现这种情况。
下面是我在处理google的一个库时的一个示例片段:(其余的服务已经中断)。
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)
有点不直观,但这是男人写角度的答案,所以对我来说已经足够好了!
发布于 2013-12-02 01:30:11
在该示例中,元素绑定将从非角事件执行。在大多数情况下,只调用$apply()而不检查阶段是安全的。
但是,如果您查看代码的其余部分,就会看到一个名为$scope的showModal()函数。该函数调用非角度代码,这可能会导致"hide.bs.modal“事件触发。如果事件通过此路由触发,则调用堆栈位于$digest中。
因此,这个事件确实属于由角托管代码和非角代码调用的函数的罕见情况。在本例中,检查$$phase是必要的,因为您不知道事件是如何产生的。如果将$$phase设置为某样东西,那么摘要循环就会完成,并且不需要调用$apply()。
这种模式通常被称为“安全适用”。
https://stackoverflow.com/questions/20263118
复制相似问题