Coffeescript 余烬:遍历子视图

Coffeescript 余烬:遍历子视图,coffeescript,ember.js,Coffeescript,Ember.js,我需要遍历一组子视图(即UI小部件),并告诉它们从应用程序中删除自己。我已确保集合中存在所有的ChildView,但是此代码一次仅对几个ChildView/Widget调用removeIfSelected() widgets = container.get('childViews') widget.removeIfSelected() for widget in widgets 例如,如果有3个小部件,第一次运行时(通过删除按钮)会删除2个小部件。我必须再次单击按钮以删除最后一个小部件 如

我需要遍历一组子视图(即UI小部件),并告诉它们从应用程序中删除自己。我已确保集合中存在所有的ChildView,但是此代码一次仅对几个ChildView/Widget调用removeIfSelected()

 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()作为克隆方法。