#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. изменен мой ответ. Отдельное объяснение как для текста, так и для числа.!