【发布时间】:2015-11-13 06:42:51
【问题描述】:
当我销毁自己的作用域时,我的程序中不断出现此错误。我在 angular 内追踪到这个 while 循环:
if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {
while(current !== target && !(next = current.$$nextSibling)) {
current = current.$parent;
}
}
我还设法在 jsFiddle 中复制了它:http://jsfiddle.net/kEyqz/1/
设置起来很容易,在一个元素上我连接一个点击事件,然后 $broadcast 它被点击,然后是一个 $apply。
在一个单独的指令(带有子作用域)中,我监听该事件,如果我看到它,我会销毁子作用域。这样做会产生错误:
Uncaught TypeError: Cannot read property '$$nextSibling' of null
这只是我试图在我的代码中完成的一个小例子。
在 current = current.$parent 之前的控制台日志记录会导致范围没有 $parent(它设置为 null)。
我可以添加行:
if(!current){
break;
}
在 current = current.$parent 之后,但如果我切换 angular 版本,我必须维护它(不理想)
【问题讨论】:
-
似乎是一个已知的错误:github.com/angular/angular.js/issues/1627
-
该错误在 9 个月前被标记为已修复,这个问题是关于当前 Angular 1.0.8 仍然存在的问题。
-
您是否看到这个问题会破坏您自己创建的范围?您的 jsFiddle 中的示例正在破坏 Angular 为您的指令创建的范围。如果我将其更改为创建然后销毁不同的范围,我看不到这个问题。 jsfiddle.net/kEyqz/2
-
问题与
$broadcast逻辑有关,因为该指令已被破坏,应通知DFS 算法忽略该指令节点。我认为您的修复没问题,您应该将其作为补丁提交。 -
看看jsfiddle.net/kEyqz/7,是你想要的吗?
标签: angularjs