(为什么)有一个“自称”的指令在一个有限的n -repeat导致一个堆栈溢出从无限递归
(Why) does having a directive that "calls itself" in a finite ng-repeat lead to a stack overflow from infinite recursion?
编辑:查看这个问题的简化版本(一个sscce)
下面的代码似乎会导致无限递归问题:
statement.directive.html
<textarea></textarea><br />
<button ng-click='statement.newStatement()'>New Statement</button>
<button ng-click='statement.newSubstatement()'>New Substatement</button>
<hr />
<statement
ng-repeat='statement in statement.curr.sections'
curr='statement'
parent='statement.curr'>
</statement>
我不知道为什么。statement.curr.sections
是零(当我测试它时)。那么指令不会"实例化/实现"吗?
<p ng-repeat='statement.curr.sections'>x</p>
不会引起任何问题。
将其包装在ng-if
中并不能解决问题。
<div ng-if='statement.curr.sections > 0'>
<statement
ng-repeat='statement in statement.curr.sections'
curr='statement'
parent='statement.curr'>
</statement>
</div>
编辑:这也不起作用(但我意识到我选择了糟糕的变量名)。
<textarea></textarea><br />
<hr />
<statement
ng-repeat='item in statementCtrl.curr.sections'>
</statement>
GitHub上的代码
我看了一下你的github代码,但它真的很令人困惑。这个名字让我的脑子一片混乱,所以我想先澄清一下。
对于一个指令,你应该使用一个前缀,这样就可以清楚地看到你引用了一个指令。myStatements, elStatement,等等
对于服务和控制器,使用后缀:StatementService, StatementController。
我不明白的地方:
<button ng-click='statement.newStatement()'>New Statement</button>
这里statement.
指的是什么?什么时候初始化/绑定到视图?编辑:没关系,我看到那是控制器。
好了,你已经有了指令的模板,引用了指令本身…
嗯,不确定一个指令是否可以有一个子指令,那就是它自己。当模板试图渲染时,似乎是无限循环。因为即使下一个层/指令没有数据,它仍然需要引导指令和它的模板,这样就会导致它加载下一个指令…它永远不会结束。
似乎是一个反模式。用例是什么?你是想画一个分形吗?lol
对于分形来说,你需要通过一个极限(即。当一个分形变得非常小,你看不到它,就不再有一个点来画它)。因此,通过施加一些限制,你可以阻止它无限地尝试绘制。
tl;dr:即使数据为空,子指令仍在初始化/呈现
相关文章:
- Angular ng repeat order将多个字段作为一个字段
- (angularJS)使ng-click在ng-repeat上打开一个链接
- ng-repeat始终呈现为指令模板中的最后一个
- ng使用一个不识别临时变量形式ng repeat的函数绑定html
- ng-repeat=“(key, value)” 不能将 {{key}} 的值用作另一个指令的全局范围的一部分
- ng-repeat和一个带有3个数组的JSON
- Angular JS嵌套的ng-repeat只有一个顶级对象
- 拆分一个 json 并使用 ng-repeat 角度指令显示它
- AngularJs:我想从数组或列表中添加一个类,用于ng-repeat中的每次迭代
- 如何在 ng-repeat 中的某个特定索引上开始一个新行
- 从另一个 Angular 控制器更新 ng-repeat
- Angularjs ng-repeat按一个属性过滤,属性重复问题
- 在“ng-repeat”中仅显示第一个和最后一个子项作为结果
- 如果在 ng-repeat中至少选中了一个复选框,则设置按钮的验证
- ng-repeat失败,并显示一个对象数组
- 角度.js在 ng-repeat 中获取 2d 数组中最后一个元素的索引
- 向 Angular ng-repeat(角度)添加一个计数器
- 在页面加载时,根据 json 对象的值向 Angularjs ng-repeat 中的元素添加一个类
- AngularJS试图将一个类添加到多个值,如果它在ng-repeat上为真
- 如何对一个元素进行ng样式设置's$索引由ng repeat创建