AngularJS中的$$阶段是什么?

我发现这个代码片段,这是一个有人写为引导模态的angular度指令的一部分。

//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(); }); 

我了解到这部分是为了绑定到后端的双向绑定,当UI改变时,绑定到hide.bs.modal事件并更新模态。

我只想知道为什么在调用apply之前为scope和rootScope检查$$阶段的人?

我们不能直接打电话申请吗?

什么是$$阶段?

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

编辑:

我find了自己的例子: Bootstrap Modal的简单angular度指令

$$phase是一个标志设置,而angular度是在一个$digest周期。

有时(在极less数情况下),您想在执行$apply之前在范围上检查$$phase 。 如果您在$digest尝试$apply ,则会发生错误:

错误:$应用已在进行中

达文是完全正确的,它是在消化周期中angular度设置的标志。

但是不要在你的代码中使用它。

我最近有机会问米斯科(angular度作者)关于$$阶段,他说永远不要使用它; 这是摘要循环的内部实现,并不是安全的。

为了确保你的代码能够在将来继续工作,他build议在$ timeout中包装你想要的“安全应用”

 $timeout(function() { // anything you want can go here and will safely be run on the next digest. }) 

如果在摘要周期中有callback或其他可能解决的事情(但不总是)

下面是我处理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的delay参数是可选的,如果未设置则默认为0( $ timeout calls $ browser.defer 如果没有设置延迟,则默认为0 )

有点不直观,但是这是来自Angular写作的人的回答,所以这对我来说已经足够了!

在这个例子中,元素绑定将从一个非angular度事件中执行。 在大多数情况下,只需调用$apply()而不检查阶段是安全的。

但是,如果查看代码的其余部分,则会有一个名为showModal()$scope函数。 该函数调用非angular度代码,这可能会导致“hide.bs.modal”事件触发。 如果事件通过这条路线触发,那么调用堆栈在$digest

所以,这个事件属于less数情况下会从angular度pipe理代码和非angular度代码中调用的函数。 在这种情况下检查$$phase是必要的,因为你不知道事件是如何发生的。 如果$$phase被设置为某事,那么摘要循环将完成并且$apply()不需要被调用。

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

我的理解是在消化或应用示波器时很好用。 如果这是真的,这意味着目前正在进行消化或$应用阶段。 如果你得到相关的错误,你可以做$ scope。$$ phase || $ scope.digest(); 如果$ scope。$$ pahse是虚假的,它将只会消化。