控制器父级在其子级之间共享内容

时间:2016-12-29 21:12:48

标签: javascript ember.js

我有一个基类,它有一些属性。我将这个类继承到另外两个控制器中。但是,每当我将内容设置为此变量时,内容将在两个控制器之间共享。我不会发生这种情况,否则我会使用Mixins。我想将一个孩子的内容设置为某个东西,当我转到另一个路径时,内容仍然是空白的。

// base controller
export default Ember.Controller.extend({
    method: null,
    actions: {
        changeMethod() {
            this.set('method', 'content is shared');
        }
    }
}
// children.js
import BaseClass from './base-class';

export default BaseClass.extend({ //code here });

// child1.hbs
{{method}} - it shows the same as child2.hbs

// child2.hbs
{{method}} - it shows the same as child1.hbs

1 个答案:

答案 0 :(得分:1)

好的,我必须做的就像他们为Mixins推荐的那样:我已经创建了一个init()方法,将变量设置为默认值。在我给它的例子中,它成了:

export default Ember.Controller.extend({
    method: null,
    init() {
        this._super():
        this.set('method', null);
    },
    actions: {
        changeMethod() {
            this.set('method', 'content is shared');
        }
    }
}

创建的对象共享相同的原型。根据Mozilla的说法:

  

对象原型对象的更改通过原型链接被所有对象看到,除非在原型链中进一步覆盖受这些更改影响的属性和方法。这为覆盖或扩展对象行为提供了一种非常强大但有潜在危险的机制。

可以看到here

的更多内容

有两种方法可以避免共享行为。

  1. 使用计算属性
  2. 正如我所做的那样初始化init功能
  3. 主题here中的更多参考为@lock表示