Ember.js вычисляет свойство из хранилища

Я пытаюсь получить простой подсчет объектов, возвращаемых REST, получить запрос с сервера для использования в другом контроллере в Ember.js.

По этой причине мне нужно сделать дополнительный запрос к серверу. По сути, вот мой код, и он почти работает... но еще не совсем. Может быть, кто-то может понять, почему.

Он возвращает PromiseArray, поэтому я использую .then() для доступа к свойствам.

App.TestController = Ember.ObjectController.extend({
    totalCount: function() {
        return this.store.find('question', {test: this.get('id')}).then(function(items) {
            var count = items.get('content').get('length');
            console.log(count); // This actually logs correct values
            return count;
        })
    }.property('question')
})

Он делает то, что должен делать, и я получаю правильные значения, распечатываемые в console.log(), но когда я пытаюсь использовать {{totalCount}} в шаблоне представления, я получаю [object Object] вместо целого числа.

Кроме того, правильно ли я соблюдаю свойство questions? если значение изменится в соответствующем контроллере, будет ли значение обновляться?

Спасибо


person kernelpanic    schedule 23.02.2014    source источник
comment
возможный дубликат Визуализация разрешенного значения обещания в шаблоне Ember handlebars   -  person aemxdp    schedule 24.02.2014


Ответы (2)


Проблема, которую вы видите, заключается в том, что вы возвращаете обещание в качестве значения свойства, и руль не будет оценивать это обещание для вас. Что вам нужно сделать, так это создать отдельную функцию, которая наблюдает за question, а затем вызвать там свой магазин, чтобы обновить свойство totalCount. Это было бы что-то вроде этого.

App.TestController = Ember.ObjectController.extend({
    totalCount: 0,
    totalCountUpdate: function() {
        var that = this;
        this.store.find('question', {test: this.get('id')}).then(function(items)     {
            var count = items.get('content').get('length');
            console.log(count);
            that.set('totalCount', count);
        })
    }.observes('question')
})
person Karl-Johan Sjögren    schedule 23.02.2014
comment
Спасибо, Карл-Йохан! Это действительно имеет смысл. Однако представление по-прежнему не получает обновленное событие, хотя console.log выводит нужные значения. Соблюдаю ли я правильное свойство? Нужно ли неявно вызывать totalCountUpdate? На мой взгляд, я все еще использую {{totalCount}}, но он застрял на 0. - person kernelpanic; 24.02.2014
comment
Заставляет меня думать, что я должен как-то наблюдать за свойством totalCount? Потому что он меняется.. - person kernelpanic; 24.02.2014
comment
Представление автоматически создаст наблюдателя для totalCount. Код выше выглядит нормально. Когда вопрос изменится, будет вызван метод totalCountUpdate, который, в свою очередь, должен вызвать set totalCount, который инициирует уведомление об изменении свойства, на которое должен реагировать пользовательский интерфейс. Можете ли вы добавить jsbin, воспроизводящий проблему? - person Miguel Madero; 24.02.2014
comment
Вам не нужно будет явно вызывать totalCountUpdate, для этого предназначена часть .observes('question') (т.е. когда question изменяется, этот метод будет запущен). Как сказал Мигель, JSBin с образцом для воспроизведения проблемы очень помог бы в ее диагностике. - person Karl-Johan Sjögren; 24.02.2014
comment
Пожалуйста, смотрите мое обновление. Я загружаю приложение онлайн вместо jsbin, чтобы вы могли видеть в контексте, о чем я говорю. - person kernelpanic; 24.02.2014

В качестве альтернативы totalCount может лениво установить себя, например:

App.TestController = Ember.ObjectController.extend({
    totalCount: 0,
    question: // evaluate to something,
    totalCount: function() {
        var that = this;
        that.store.find('question', {test: that.get('id')}).then(function(items)     {
            var count = items.get('content').get('length');
            that.set('totalCount', count);
        })
    }.observes('question').property()
})
person Elise Chant    schedule 18.09.2014