1

我正在尝试在init生命周期挂钩中为我的一个组件分配默认值;以防从父组件传递未定义的值。最初,一切似乎都按预期工作。但是,当我的组件被强制重新渲染时(可能通过父组件的另一个属性值更新);父组件的未定义值被写回我的组件。

这表示; 我在初始化时所做的赋值并没有反映到父组件上,也就是说双向绑定暂时不起作用(父子组件的值不同步)。这是预期的行为还是我错过了什么。对 init 事件重要吗?初始化组件的未定义值的合适位置在哪里?请参阅twiddle以获得简单的说明。

4

2 回答 2

3

好的,首先一种解决方法是update使用attr. 看看这个 twiddle

this.set('name', 'tom')this.attrs.name.update('tom')in.js{{name}}替换{{attrs.name}}.hbs.

另一种解决方法是将分配包装成我在这里Ember.run.later所做的那样,我将其替换为:this.set('name', 'tom')

Ember.run.later(() => {
  this.set('name', 'tom');
});

这就是解决方法。

绑定没有完全设置在 init 上的事实由来已久。但通常它是一种反模式,用于初始化子组件中的值并将该值交给父组件。它使您的代码可读性降低,并且违反了DDAU(数据向下,动作向上)原则。

我建议在创建模型时显式初始化数据,而不是在组件评估周期中隐式初始化。

对于您不想存储的默认值,我建议您编写一个计算属性:

nameWithDefault: computed('name', {
    get() {
        return get(this, 'name') || 'tom';
    },
    set(key, val) {
        set(this, 'name', val);
    }
})

这是明确的,在查看组件后不会写下数据,并且适用于用户。

于 2016-05-17T14:17:14.153 回答
0

我同意 Lux 的解决方案,但如果您想尝试其他方法,也许在您的子组件上,您可以添加一个计算属性来检查名称或默认为另一个字符串。这允许您在不同的子模板上有不同的默认值(假设您有使用相同name属性的不同子组件)。

子组件.js

export default Ember.Component.extend({
  child_name: Ember.computed('name', function() {
    return this.get('name') || 'tom';
  }),
});

子组件.hbs

{{child_name}}
<br>
{{surname}}
于 2016-05-20T14:29:14.263 回答