Ember 3 вычислитель сеттеров - PullRequest
0 голосов
/ 26 апреля 2019

В Ember v3.x что-то изменилось в отношении установки значения для вычисляемого свойства? В моем классе у меня есть CP с именем "cp1"

Раньше с Ember 2.x я раньше делал

this.cp1 = cp1

Но с Ember 3.x вышеприведенное не работает. Нужно ли обновлять способ установки CP с помощью Ember 3.x?

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Глядя на ваш вопрос, я сразу вижу две проблемы, первая из которых связана с отсутствием 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

0 голосов
/ 26 апреля 2019

Вы должны использовать defineProperty, если вам нужно определить вычисляемые свойства динамически:

import { defineProperty, computed } from '@ember/object';

export default Component.extend({
  init() {
    defineProperty(this, 'myComputedProperty', computed('someDependentKey', function() {
      return null;
    });
  }
});
...