Как прослушать изменение значения родительского компонента в дочернем компоненте ember octane?

#javascript #ember.js #ember-data #ember-cli #ember-octane

#javascript #ember.js #ember-данные #ember-cli #ember-octane

Вопрос:

Это мой код

 parent.hbs
 
 <ChildComp
   @value={{this.changes}}
 />


parent.js
export class ParentComponet extends Component {
  @tracked this.changes = [1,2,3]
  
  @action addChanges() {
     this.changes = [...this.changes, this.changes.length]
  }
}

child-comp.js
export class ChildComponet extends Component {
   // I wanted to observe this.args.changes updated
   // Based on that I need to call some operation
   get operation() {
      let parent = this.args.values.map((obj) {
            if (obj.parent !== null) {
             set(obj, 'goal', null);
             set(obj, 'newSubGoal', null);
            }
    });
   }
}
 

Я хотел наблюдать за this.args.changes в моем дочернем компоненте. Как я могу это сделать в ember-octane?

Ответ №1:

Я предполагаю, что вы используете последние функции Octane в своем приложении из фрагмента кода.

Мы можем сделать свойство класса реактивным с помощью @tracked декоратора. Таким образом, когда отслеживаемое значение изменяется в родительском компоненте, то же самое изменение будет распространено во всех местах, где оно используется. В вашем случае вы передали значение в дочерний компонент, и, таким образом, изменения также будут отслеживаться внутри дочернего компонента.

класс родительского компонента:

 export class ParentComponent extends Component {
  @tracked changes = [1,2,3];
  
  @action addChanges() {
     this.changes = [...this.changes, this.changes.length]
  }
}
 

В вашем дочернем компоненте вы можете использовать геттеры для соответствующего пересчета изменений. геттер будет пересчитываться при каждом изменении значения, доступного внутри геттера. Например, из вашего кода, если вам нужно получить сумму массива,

класс дочернего компонента:

 export class ChildComponent extends Component {
   // This getter will be computed every time the `changes` array changes.
   get sum() {
     return this.args.value.reduce((a, b) => a   b, 0);
   }
}
 

дочерний шаблон:

 SUM: {{this.sum}}
 

Редактировать

Если вам нужно запустить произвольную функцию при изменении значения (чаще всего для синхронизации с внешними библиотеками или ручных изменений DOM), вы можете использовать {{did-update}} модификатор ember-render-modifiers

Комментарии:

1. Что, если я просто установлю что-то внутри get и не буду использовать это значение суммы в шаблонах. Я обновлю свой вопрос

2. Привет @Gokul изменил вопрос. Можете ли вы ответить на этот сценарий? Я как бы застрял в этом.

3. Я думаю, вам нужны крючки жизненного цикла, чтобы следить за обновлением аргумента. Это было переведено в модификаторы рендеринга. Вы можете использовать {{did-update}} модификатор github.com/emberjs/ember-render-modifiers для запуска функции при изменении значения.