简体   繁体   English

如何从父组件设置Ember组件的内部状态?

[英]How to set Ember component's internal state from parent component?

I have a table component which continas several row components. 我有一个表组件,它连续几个行组件。 Each row component has a isSelected property. 每个行组件都有一个isSelected属性。

Once a while I would like to reset all row components' isSelected inside to false from table's component clear action (a button). 偶尔我想通过表的组件clear操作(一个按钮)将所有行组件的isSelected内部重置为false

How can I achive this functionality? 如何实现此功能? Does passing data down is the only way to alter the internal state of a component? 传递数据是否是更改组件内部状态的唯一方法?

Row Component 行组件

export default Ember.Component.extend({
    tagName: 'tr',
    isSelected: false,
    classNameBindings: ['isSelected:selected'],

    click() {
        const data = this.get('data');
        const selectedState = this.get('isSelected');
        this._toggleSelected();

        if (selectedState) {
            this.sendAction('rowClicked', {data: data, operator: 'remove'});
        } else {
            this.sendAction('rowClicked', {data: data, operator: 'add'});
        }
    },

    _toggleSelected() {
        this.toggleProperty('isSelected');
    }
});

Table Selectable Component 表可选组件

export default Ember.Component.extend({
    selectedRows: [],
    classNames: ['table-selectable'],

    actions: {
        rowClicked(row) {
            this._addToSelectedRows(row);
        },

        cleanSelectedRows() {
            this._cleanSelectedRows();
        }
    },
    _addToSelectedRows(row) {
        console.log(row);
        this.get('selectedRows').addObject(row);
    },
    _cleanSelectedRows() {
        this.set('selectedRows', []);
    }
});

A table is composed of some rows. 一个表由一些行组成。 You could keep references of rows in table and call their public methods. 您可以在表中保留行的引用并调用其公共方法。

//row.js

    export default Ember.Component.extend({
      didInsertElement(){
        this._super(...arguments);
        this.get('table').registerRow(this);
      },

      setSelected(selected){
        this.set('isSelected', selected);
      }
    });


//table.js

    export default Ember.Component.extend({
      rows: Ember.computed(function(){return Ember.A();}),
      registerRow(row){
        this.get('rows').pushObject(row);
      },
      clearAll(){
        this.get('rows').forEach(function(row){
          row.setSelected(false);
        });
      }
    });


//table.hbs

{{table-row table=this}}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM