Контроллер массива Emberjs

Мой маршрут:

export default Ember.Route.extend({
    model: function (params) {
        var blocks = this.store.find('block', {'objectId': 777});
        this.controllerFor("blocks").set('model', blocks);
        return Ember.RSVP.hash({
            object: this.store.find('object', params.id),
            blocks: blocks
        });
        //return this.store.find('object', params.id);
    }
});

Мой контроллер:

export default Ember.ArrayController.extend({
    init: function(e){
        alert('jere');
    }
});

Предупреждение в функции инициализации работает, но затем я получаю сообщение об ошибке:

Ошибка при обработке маршрута: objects.bc.index Не удается прочитать свойство «длина» нулевого значения TypeError: Невозможно прочитать свойство «длина» нулевого значения

Каков правильный способ получить коллекцию моделей через ajax и показать ее в шаблоне с помощью пользовательского контроллера массива?


person Costa    schedule 25.05.2015    source источник
comment
Вот полномасштабный пример, показывающий, как использовать ArrayController с ванильным (ish) ajax. Комментарии от @torazaburo верны в отношении хэша и массива (модели), но это должно заставить вас двигаться (это основано на ember-cli). github.com/toranb/async-kanban-board-store-example   -  person Toran Billups    schedule 26.05.2015


Ответы (1)


Этот код имеет ряд проблем. Во-первых, ArrayController предполагает, что его модель представляет собой массив, тогда как ваш хук model возвращает хэш. Во-вторых, ваш вызов this.controllerFor("blocks").set('model', blocks) пытается установить модель контроллера в обещание, что бесполезно. Вы не устанавливаете модель контроллера в хуке model вот так. Вы устанавливаете его, возвращая модель, которая затем устанавливается (после разрешения) в контроллер с помощью вашего (или используемого по умолчанию) хука setupController.

Вы не должны использовать ArrayController, который в любом случае скоро станет устаревшим, а вместо этого используйте простой старый контроллер. Моделью для этого контроллера будет хеш, возвращенный хуком model. Вам нужно получить к нему явный доступ в шаблоне с помощью {{model}}.

Итак, вы хотите что-то вроде этого:

// route.js
export default Ember.Route.extend({
    model: function(params) {
        var blocks = this.store.find('block', {'objectId': 777});
        return Ember.RSVP.hash({
            object: this.store.find('object', params.id),
            blocks: blocks
        });
    }
});

// controller.js
export default Ember.Controller.extend({
    init: function(e) {
        alert('jere');
    }
});

В ваших шаблонах вместо

{{#each controller}}
    blockProp is {{blockProp}}

как вы предположительно делаете сейчас, используйте

{{#each block in model.blocks}}
    blockProp is {{block.blockProp}}
{{/each}}
And objectProp is {{model.object.objectProp}}
person Community    schedule 25.05.2015
comment
{{#each block as model.blocks}} должно быть {{#each model.blocks as |block|}} - person Hasib Mahmud; 25.05.2015