所以我只是想弄明白Ember是怎么工作的。
所以我有ComponentOne,它有propertyA(布尔值)和property2(数组),如果propertyA === true,模板将为propertyB的每个成员呈现和示例化ComponentTwo:
{{#if propertyA}}
{{#each propertyB as |collection]}}
{{ComponentTwo data=collection}}
{{/each}}
{{/if}}
在处理这个问题时,我们发现ComponentTwo中的一个事件处理程序没有运行,尽管我们可以验证该事件正在触发。
通过一些明智的断点和登录到控制台,我能够确定这是按照以下顺序发生的:
1.创建ComponentTwo的示例
1.使用data
的相同对象创建ComponentTwo的第二个示例。
1.销毁在步骤1中创建的第一个示例。
理论上,这会扰乱事件处理程序,因为该处理程序在ComponentTwo.init()
中设置,在ComponentTwo.willDestroy()
中删除。Eventer是一个单例,它会为组件的两个示例删除它。
所以我的问题是为什么Ember要创建两个示例呢?它迭代的数组只有一个成员。
1条答案
按热度按时间mklgxw1f1#
您所执行的操作会导致组件重新呈现。
也许你切换了布尔属性两次。
也许你在改变或替换数组。
当数组更新时,Ember不知道哪些已经渲染的项目对应于新数组的哪个元素,所以它必须重新渲染所有内容,这将导致组件被重新示例化。
您可以使用
key
参数让Ember即使在数组更改时也能识别项目。要做到这一点,数组中的每一项都需要是一个对象,例如:
现在您可以使用
id
属性做为索引键,如下所示: