Ember.js 从父级到子级的余烬数据绑定

Ember.js 从父级到子级的余烬数据绑定,ember.js,Ember.js,我一周前才开始学习ember,我对数据投标有点困惑: 我的索引控制器具有foor属性 测试组件,该组件具有从索引控制器提交的its条属性 索引 index.hbs//模板 parent value : {{foo}} {{test-component bar=foo }} index.js//控制器 import Ember from 'ember'; export default Ember.Controller.extend({ foo: "", }); 测试组件//模板

我一周前才开始学习ember,我对数据投标有点困惑:

  • 我的
    索引
    控制器具有
    foor
    属性
  • 测试组件
    ,该组件具有从索引控制器提交的its
    属性

索引

index.hbs//模板

parent value  : {{foo}}

{{test-component bar=foo }}
index.js//控制器

import Ember from 'ember';

export default Ember.Controller.extend({
  foo: "",
});
测试组件//模板

child value {{bar}}
测试组件//组件

import Ember from 'ember';

let TestComponent = Ember.Component.extend({
});

TestComponent.reopenClass({
  positionalParams: ['bar'],
});

export default TestComponent;

令人困惑的是:

  • 如果在我的索引模板中将组件写为
    {{testcomponent foo}}
    ,我只会得到单向数据绑定,这意味着如果我更改组件中的
    bar
    属性,
    foo
    属性不会更改

  • 如果我在我的组件中使用
    {{input value=bar}}
    ,我可以看到
    bar
    foo
    都得到了更新,所以bar绑定到foo和input value组件??它是如何工作的(PS:正如我在问题1中所说,只有当我在索引模板
    {{testcomponent bar=foo}}}


  • 谢谢大家。

    更新:位置参数具有单向绑定,而命名参数具有双向绑定的行为是<2.9.0版中的一种行为

    传入命名参数而不是传入位置参数时更新控制器的原因是命名参数已绑定而位置参数未绑定


    传入命名参数而不是传入位置参数时更新控制器的原因是命名参数已绑定而位置参数未绑定


    .

    最好避免双向绑定,并依赖于分离这两个操作。这称为数据向下;操作向上。。要说明您的模板可能如下所示:

    {{test-component foo=bar update=(action (mut bar))}}
    
    然后在
    测试组件中
    组件只需调用更新操作

    this.get('update')(newValue);
    
    通过这种方式,foo在父对象进行更改之前(从
    (操作(mut bar))
    行)不会更改。它分离了关于谁拥有真相的担忧


    显然,这是一条可以打破的经验法则(有关打破规则的示例,请参见
    {input}
    帮助程序)。但您应该知道这样做的时间和原因。如果您的目标是编写所有组件,使其不更改提供的数据,而是触发操作,那么这将使您的应用程序更易于推理和维护。

    最好避免双向绑定,并依赖于分离这两个操作。这称为数据向下;操作向上。要说明您的模板可能如下所示:

    {{test-component foo=bar update=(action (mut bar))}}
    
    然后在
    测试组件中
    组件只需调用更新操作

    this.get('update')(newValue);
    
    通过这种方式,foo在父对象进行更改之前(从
    (操作(mut bar))
    行)不会更改。它分离了关于谁拥有真相的担忧


    显然,这是一条可以打破的经验法则(有关打破规则的示例,请参见
    {input}
    帮助程序)。但您应该知道这样做的时间和原因。如果您的目标是编写所有组件,使其不更改提供的数据,而是触发操作,那么这将使您的应用程序更易于推理和维护。

    有趣的是,如果我们将ember版本更改为alpha,那么位置参数也会起作用比如bound.这是正确的还是alpha版本中的bug?哦,是的,这很有趣。2.2.2到2.81(版本)没有绑定行为,但是alpha、beta和canary有。可能是Glimmer2。有趣的是,如果我们将余烬版本更改为alpha,那么位置参数也会像绑定一样。这是正确的还是alpha版本中的错误?哦,是的,这很有趣。2.2.2到2.81(版本)没有束缚行为,但阿尔法、贝塔和金丝雀有。可能是微光2是原因参考此..可能提供更多见解参考此..可能提供更多见解