AngularJS:$ digest循环传播如何与隔离范围一起工作?

时间:2017-03-02 12:35:25

标签: angularjs

我编写了一个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如何在指令属性和它周围的控制器之间实现同步?

0 个答案:

没有答案