如何防止ember中控制器和组件之间嵌套数组对象的同步

时间:2017-04-13 14:02:03

标签: ember.js

我正在研究 Ember.js 2.12.0

如何防止控制器和组件之间嵌套数组对象的同步。

对于ember字符串,它的工作原理但嵌套数组对象无效。

下面是ember twiddle link

ember twiddle

如果您更改字符串 arr 的值并点击进入HOME路线并再次进入ABOUT路线,那么您可以看到<的值strong>字符串已更改,但 arr 的值未更改

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

String是primitive typed对象,但Array不是。因此,当组件修改str时,它不会反映到控制器str。因为您正在组件中复制其值。您可以通过向{{str}}添加about.hbs来尝试此操作。看到它没有改变。 (在你现在的旋风中。)

但阵列不同。它不仅仅是一种价值。组件的arr与控制器arr相同。当组件修改它时,您可以在about.hbs中看到它的更改。 (另请参阅按值传递,按引用传递。)

另一方面,控制器是单件控制器,它们存储最后一个值。因此,无论何时更改数组,您都可以看到它是持久的。

上面,我提到了原因。下面我将提到解决方案:

  1. 备选方案1,在将数组发送到组件之前克隆该数组。
  2. 备选方案2,在路由的特定挂钩中重置阵列。
  3. 备选方案3,使用model挂钩生成并发送数组。
  4. 我还修改了您的组件,请参阅this twiddle

    此外,永远不要在对象定义中定义数组。因为该类的所有实例将共享相同的数组实例。 (它也写在the guide的某个地方。)

答案 1 :(得分:0)

import Ember from 'ember';

export default Ember.Route.extend({
  setupController(controller, model){
    controller.set("arr",[{name:'ravi kumar'}])
  }
});

这将确保您始终获得重置。

您在routes / about.js

中创建的此文件