Почему помощник handlebars «if» не вызывает вычисляемое свойство фактической модели?

#ember.js #handlebars.js

#ember.js #handlebars.js

Вопрос:

Я поддерживаю приложение в Ember, и это «вычисляемое свойство» на самом деле никогда не вычисляется помощником if блока в шаблоне.

Модель:

 var item = App.Item.create({
    isAddedToCart: function () {
        console.log('addedToCart method has been called');
        return false;
    }.property()
});
 

Шаблон:

 {{#if item.isAddedToCart}}
    {{log 'true'}}
{{else}}
    {{log 'false}}
{{/if}}
 

В моем компоненте, который находится в шаблоне, console.log() никогда не вызывается, но функция, похоже, проверяется, соответствует ли она действительности или нет. Что-то не так в моем подходе?

Редактировать: приложение написано на Ember версии 1.7 (я знаю …)

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

1. Я не думаю, что вы можете создать вычисляемое свойство внутри create({...}) . Можете ли вы попробовать это с extend({...}).create(); , Но это выглядит как старый эмбер, так что,…

2. Наверное, вы .set() isAddedToCart где-то есть? При этом вы переопределяете вычисляемое поведение.

3. @Lux хороший ответ, но я нигде не переопределял свойство, оно предназначено исключительно для чтения.

4. @Keo он старый, 1.7. Я обновил вопрос, но он не дает мне покоя, как сумасшедший.

Ответ №1:

Какие версии вы используете в настоящее время, на самом деле я попробовал то, что вы сделали в ember версии 1.12.2, и я получил следующие утверждения, которые четко объясняют, как это решить.

Ошибка при обработке маршрута: ошибка утверждения индекса: Ember.Object.create больше не поддерживает определение вычисляемых свойств. Определите вычисляемые свойства с помощью функции extend() или reopen() перед вызовом функции create(). Ошибка: Ошибка утверждения: Ember.Object.create больше не поддерживает определение вычисляемых свойств. Определите вычисляемые свойства с помощью функции extend() или reopen() перед вызовом функции create().

Я создал образец twiddle, чтобы продемонстрировать использование,

controllers/application.js

 import Ember from 'ember';

var App.Item = Ember.Object.extend({    
});
App.Item.reopen({
  isAddedToCart: function () {
        console.log('addedToCart method has been called');
        return false;
    }.property()
});
export default Ember.Controller.extend({
  appName: 'Ember Twiddle ',
  itemObj : App.Item.create(),
});
 

и в application.hbs,

 {{itemObj.isAddedToCart}}
 

Может быть для более ранней версии, если ember позволяет то, что вы сделали, может возникнуть проблема ниже,
— убедитесь item , что свойство доступно в шаблоне
— проверьте переопределение любого места или ручного набора для isAddedToCart

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

1. Спасибо. На данный момент мне повезло бы использовать 1.12. В настоящее время приложение написано на версии 1.7, которая, я не думаю, устарела от этого метода. Я обновлю вопрос

2. @SimonStiph обновил мой ответ таким образом, как вы можете реорганизовать свой код.. Есть ли какое-либо узкое место для рефакторинга вашего кода? .. в любом случае, при обновлении вы придете к этому коду рефакторинга.