Вычисляемые свойства Ember 3

#javascript #ember.js #properties #migration

#javascript #ember.js #свойства #миграция

Вопрос:

Я пытаюсь перейти с ember 2 на ember 3, и у меня возникают проблемы с вычисляемыми свойствами.

Раньше у меня были такого рода вычисляемые свойства в компоненте :

 import Ember from 'ember';

totalPrice: Ember.computed('attr1', 'attr2', function() {
    return this.attr1   this.attr2;
})
  

и я мог бы сделать в шаблоне hbs что-то вроде :

 Total : {{totalPrice}}
  

В новой версии ember у меня есть это :

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

totalPrice: computed('attr1', 'attr2', function() {
   return this.attr1   this.attr2;
})
  

Но в шаблоне свойство TotalPrice отображается как [object] , а не со значением. Я что-то упускаю?

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

1. Обычно это то, что происходит, когда вы возвращаете обещание в шаблон. У вас, случайно, нет async function в вашем реальном коде?

2. нет, в моем коде нет никакой асинхронной функции, но, возможно, я что-то пропустил

3. @Gemkodor Пожалуйста, проверьте мой ответ, если вы считаете, что мое решение было полезным. Спасибо

Ответ №1:

Я думаю, вам нужно использовать function вместо функции со стрелкой, потому что с функциями со стрелкой this теряется.

с помощью вычисляемого function сохраняется this ссылка на экземпляр компонента.

 computed('attr1', 'attr2', function() {
   return this.attr1 amp;amp; this.attr2;
})
  

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

1. На самом деле я уже использовал функцию вместо функции со стрелкой, я допустил ошибку в своем описании проблемы. Я отредактировал описание моей проблемы, на самом деле моя проблема больше в том, «как получить доступ к вычисляемому свойству в шаблоне». После моей миграции он отображается как [object] в шаблоне, и я не понимаю, почему

2. какую версию ember вы используете? собственные методы получения не добавлялись до ember 3.1, я думаю

3. я использую ember 3.8

4. можете ли вы рассказать, что такое this.attr1 и this.attr2 ? или реплицировать на ember-twiddle.com ?

5. Это странно, я пытался повторить на ember-twiddle, но это работает. У меня есть что-то похожее на: ember-twiddle.com/… За исключением того, что в моем случае вычисляемое свойство не вызывается

Ответ №2:

Вот фрагмент специально для ember-cli 3.4

 import Controller from '@ember/controller';
import { computed } from '@ember/object';

export default Controller.extend({
  appName: 'Ember sdfa',

  attr1: 1,
  attr2: 2,
  attr3: 'foo',
  attr4: 'bar',
  attr5: 3,
  attr6: 4,

  totalPrice: computed('attr1', 'attr2',function() {
    let a = this.attr1 ? this.attr1 : 0;
    let b = this.attr2 ? this.attr2 : 0;
    let total = a   b;

    return total;
  }),
});
  

Это должно сработать для получения totalPrice , вот ember twiddle, с которым вы можете поиграть
https://ember-twiddle.com/8801e28a888b469b8057d67a63829808?openFiles=controllers.application.js,

Если вы хотите объединить строку вместе, она должна быть такой

   fooBar: computed('attr3', 'attr4', function() {
    let foo = this.attr3 ? this.attr3 : null;
    let bar = this.attr4 ? this.attr4 : null;

    return `${foo} ${bar}`
  }),
  

и результат был бы foo bar

Если вы хотите объединить число, пожалуйста, следуйте приведенным ниже инструкциям

 combinedNumber: computed('attr5', 'attr6', function() {
    let a = this.attr5 ? this.attr5 : null;
    let b = this.attr6 ? this.attr6 : null;

    return `${a} ${b}`
  }),
  

результат combineNumber равен 3 4

Надеюсь, это поможет.

Ответ №3:

Приведенный ниже код должен работать нормально.

Если attr1 и attr2 являются текстом.

 import { computed } from '@ember/object';
...
totalPrice: computed('attr1', 'attr2', function() {
  return `${this.attr1} ${this.attr2}`;
})
  

attr1 и attr2 являются числом.

 attr1: 1,
attr2: 2,
totalPrice: computed('attr1', 'attr2', function () {
  return this.attr1   this.attr2;
  //(or)
  return `${this.attr1   this.attr2}`;
}),
  

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

1. Я думаю, что totalPrice это вычисляемое свойство, которое добавляет два свойства, которые приведут к number поэтому return ${this.attr1} ${this.attr2} ; может оказаться невозможным. Если это строка, то return ${this.attr1} ${this.attr2} ; применим, потому что вы объединяете два свойства, которые являются строковыми. Я полагаю, что он хочет добавить свойство two number.

2. изменен мой ответ. Отдельное объяснение как для текста, так и для числа.!