Глядя на ваш вопрос, я сразу вижу две проблемы, первая из которых связана с отсутствием this.set()
, а вторая - то, что вам потребуется явно определить установщик, чтобы он работал так, как вам хотелось бы.Я более подробно остановлюсь ниже.
Что касается вашего вопроса об этом изменении между Ember 2.x и Ember 3.x, я не помню никаких изменений, которые могли бы изменить это поведение, но @Lux равен 100% прямо в своем комментарии к вам, это никогда не поддерживалось поведение, поэтому вы могли делать что-то, что случайно сработало ?
Итак, сначала давайте поговорим об использовании this.set()
.У Ember есть объектная модель, которая требует использования this.set()
для обновления свойств, чтобы другие части системы (например, шаблоны или вычисленные свойства) могли получать уведомления об изменениях.Подробнее об этом можно прочитать в официальной документации для доступа к свойствам объекта в Ember .
Второе, что важно упомянуть, это то, что не рекомендуется переопределять вычисляемые свойства, которые неу него есть сеттеры.Для новых разработчиков этого было достаточно, так как установка вычисляемых свойств без геттеров официально устарела с Ember 3.8 , что означает, что в следующей основной версии Ember (Ember 4.0) поведение по умолчанию изменится.
Если вы хотите установить вычисляемое свойство, вы можете прочитать документацию для определения установщика в Ember , но я также приведу вам пример ниже.
Предполагая, что у вас есть вычисленное значениесвойство fullName()
, которое объединяет firstName
и lastName
fullName: computed('firstName', 'lastName', function() {
return `${this.firstName} ${this.lastName}`;
}),
, если вы установите это вычисляемое свойство (например, в действии)
this.set('fullName', 'Chris Manson');
, тогда вы будетепереопределяет поведение вычисляемого свойства, и оно перестает обновляться, если вы изменили firstName
или lastName
.
Если вы хотите реализовать некоторую бизнес-логику, которая фактически разбивает строку Chris Manson
и задает Chris
как firstName
и Manson
как lastName
, тогда вы обновите вычисляемое свойство так:
fullName: computed('firstName', 'lastName', {
get() {
return `${this.firstName} ${this.lastName}`;
},
set(propertyName, newValue) {
// propertyName is not used - if you logged it then it would say `fullName`
let pieces = newValue.split(' ');
this.set('firstName', pieces[0]);
this.set('lastName', pieces[1]);
return newValue;
}
}),
Это позволит вамОбновите вычисляемое свойство, не удаляя его «вычисляемый» характер. ?
Этот вопрос был дан в рамках второго сезона первого сезона «Можно задать вопрос» 1. Если вы хотите, чтобы мы обсудилиэтот ответ полностью и проработайте пример кода вы можете посмотреть видео здесь: https://youtu.be/v1rBL5_KPqU