Как получить реальные значения 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 hook
ember-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
}
}
});