我编写了一个AngularJS(1.x)指令,它包含一个名为browser
的纯javascript库对象。
为了更新Angular范围变量和视图以响应browser
内发生的事件,我必须手动调用$apply
,调用摘要循环:
scope.browser.on({
afterSetRange: function(){
if (!scope.$$phase) scope.$apply();
}
});
这很好,当我的指令没有创建自己的scope
时 - 我在指令定义对象(DDO)中说scope: false
。在这种情况下,scope
引用页面控制器的$scope
。
但是,当我使用scope: {myattr: '='}
的隔离范围时,这显然不会让我无法获得:
Error: [$rootScope:inprog] $digest is already in progress
我将if (!scope.$$phase) scope.$apply
替换为$timout(angular.noop)
解决了这个问题。 (这意味着,scope.$apply
设计得很差 - 它应该起作用,而不是强迫人们挖掘它的内部结构)。我真正想要的是对以下理论问题的回答,而不是实际的帮助:
我不理解$digest
循环背后的理论。 rootScope.$new()
Documentation表示$digest
事件从rootScope传播到其子节点。那么,我们是否为整个角度应用程序提供了一个摘要循环?或者每个范围都有一个循环?
当我在指令中使用双向数据绑定时(例如scope: {myattr: '='}
),Angular如何在指令属性和它周围的控制器之间实现同步?