Coffeescript 余烬:遍历子视图
我需要遍历一组子视图(即UI小部件),并告诉它们从应用程序中删除自己。我已确保集合中存在所有的ChildView,但是此代码一次仅对几个ChildView/Widget调用removeIfSelected()Coffeescript 余烬:遍历子视图,coffeescript,ember.js,Coffeescript,Ember.js,我需要遍历一组子视图(即UI小部件),并告诉它们从应用程序中删除自己。我已确保集合中存在所有的ChildView,但是此代码一次仅对几个ChildView/Widget调用removeIfSelected() widgets = container.get('childViews') widget.removeIfSelected() for widget in widgets 例如,如果有3个小部件,第一次运行时(通过删除按钮)会删除2个小部件。我必须再次单击按钮以删除最后一个小部件 如
widgets = container.get('childViews')
widget.removeIfSelected() for widget in widgets
例如,如果有3个小部件,第一次运行时(通过删除按钮)会删除2个小部件。我必须再次单击按钮以删除最后一个小部件
如果有2个,它将删除一个小部件。如果有4个或更多,除2个小部件外,所有小部件都将被删除,我必须再单击删除2次才能删除最后两个小部件
我最初的解决方案是运行循环3次,这保证了所有小部件都被删除,但是这并没有通过代码审查,我必须找到一个真正的解决方案。我不确定这是咖啡脚本问题还是Ember.js问题。如何确保循环完全执行?听起来像是
小部件。removeIfSelected()
正在更改您背后的小部件数组,以便在删除某些内容后,您的for
循环中的长度和索引都会出错。考虑这个循环:
a = [ 0, 1, 2, 3, 4, 5 ]
for e, i in a
console.log(i) if(i % 2 == 0)
这显然会在控制台中生成0,2,4
。然而,这:
a = [ 0, 1, 2, 3, 4, 5 ]
for e, i in a
a.splice(i, 1) if(i % 2 == 0)
console.log(a)
在a
中留给您[1,2,4,5]
,因为a
在循环时正在被修改
有两种常见的解决方案:
向后迭代,这样更改不会影响即将发生的任何事情,它们只会影响您已经经历过的事情
复制你正在迭代的内容,这样你就可以迭代一件事并改变另一件事
第一个是这样的:
for i in [widgets.length - 1 .. 0] by -1
widget.removeIfSelected()
widgets = clone(container.get('childViews'))
widget.removeIfSelected() for widget in widgets
第二个是这样的:
for i in [widgets.length - 1 .. 0] by -1
widget.removeIfSelected()
widgets = clone(container.get('childViews'))
widget.removeIfSelected() for widget in widgets
其中,clone
是可用于制作阵列(浅层)副本的任何内容。如果您有下划线,则可以使用:
您也可以手工完成:
clone = (a) -> e for e in a
真不敢相信我竟然忽略了这一点。克隆方法非常有效。谢谢。我想您可以使用内置的ember.js函数toArray(),'container.get('childview').toArray()作为克隆方法。