Как получить реальные значения attr в хуке didReceiveAttrs, если это изменяемая ячейка

Пожалуйста, смотрите ниже пример кода. Учитывая, что у меня есть компонент my-text-box

my-text-box.hbs

{{my-text-box value=modelName}}

Я хочу наблюдать за изменениями value собственность через didReceiveAttrs крюк вместо observers для лучшей производительности.

my-text-box.js

didReceiveAttrs: function(args) {
    if (args.oldAttrs == null) {
        // This is the initial render, but I don't need to anything here.
    } else if (args.newAttrs.value != args.oldAttrs.value) {
        // supposed `value` was changed from outside, I can do something here...

        // BUT, `args.newAttrs.value` is not always the prop value, 
        // `Ember` would automatically wrap it with `{{mut}}` helper. 
        // The data structure would be: 
        // {
        //    value: value,
        //    update: function (val) {
        //        source.setValue(val);
        //    }
        // }
    }
}

Что я хочу, так это то, что мне не нужно заботиться о том, является ли значение attr mutable ячейка или нет, я должен получить способ, который всегда получит реальное значение. Я вижу, что есть HTMLBars hookember-htmlbars/hooks/get-value но он не доступен для публичного API. И я думаю, что, возможно, Ember должен изменить оба newAttrs а также oldAttrs иметь прямые ценности вместо тех, mutable объекты.

У кого-нибудь есть способ справиться с этим? Спасибо!

2 ответа

Аргументы крюка жизненного цикла компонента Ember устарели в соответствии с RFC# 191.

Так что было бы лучше сделать так:

Ember.Component.extend({
  didReceiveAttrs() {
    let oldAttrs = this.get('_previousAttrs');
    let newAttrs = this.get('newAttrs');

    if (oldAttrs && oldAttrs !== newAttrs) {
      this.map.move({ from: oldAttrs, to: newAttrs });
    }

    this.set('_previousAttrs', newAttrs);
  }
});

Или, может быть, вы можете использовать это дополнение ember-diff-attrs некоторое время.

Мое предложение состоит в том, чтобы сохранить предыдущее значение самостоятельно, а затем сравнить:

export default Ember.Component.extend({
  _previousAttr: null,

  didReceiveAttrs() {
    this._super(...arguments);
    if (this.get('_previousAttr') !== this.get('attrName')) {
      this.set('_previousAttr', this.get('attrName'));
      // do your thing
    }
  }
});
Другие вопросы по тегам