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是虚假的,它将只会消化。