2015-07-02 4 views
4

У меня есть это productsCount вычисленное свойство, которое должно считать все products, но оно всегда возвращает 0. Почему это и как я могу его исправить?Вычислительная длина модели

controller.js

productsCount: Ember.computed('model.products', function() { 
    var products = this.get('model.products'); 
    return products.get('length'); 
}), 

route.js

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model: function() { 
    return { 
     products: this.store.find('product') 
    }; 
    } 
}); 
+1

Я сомневаюсь, что проблема в том, что CP всегда возвращает ноль. Вы проследили его? Проблема почти достоверна в том, что CP «не вызывается при изменении длины» - это потому, что, вы не говорите ему, чтобы пересчитать, когда изменяется длина. –

ответ

9

model.products прошел в вашем вычисленного собственности, просто срабатывает, когда this.get('model').set('products', [...]) называется. Но так как products - это массив, похожий на объект, свойство length, вероятно, будет изменено, когда кто-то вызовет products.pushObject(...), который не заставит ваше вычисляемое свойство перепроверить, потому что ссылка на массив products не изменяется, просто ваше содержимое.

Чтобы исправить это, вы должны добавить к вашему .length зависимому ключу вычисленной собственности, например, так:

productsCount: Ember.computed('model.products.length', function() { 
    return this.get('model.products.length'); 
}) 

Поскольку вы только альясинг свойства, вы можете воспользоваться Ember.computed.alias и упростить код :

productsCount: Ember.computed.alias('model.products.length') 

есть и другие очень полезные вычисленные макросы в Ember.computed.* вы можете захотеть взглянуть на docs для получения дополнительной информации

Смежные вопросы