2015-05-25 3 views
2

Мой маршрут: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'); 
    } 
}); 

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

Error while processing route: objects.bc.index Cannot read property 'length' of null TypeError: Cannot read property 'length' of null

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

+0

Вот полномасштабная пример, показывающий, как использовать ArrayController w/vanilla (ish) ajax. Комментарии от @torazaburo правильны относительно хеша и массива (модели), но это должно привести к вашей прокатке (это основано на ember-cli). https://github.com/toranb/async-kanban-board-store-example –

ответ

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}} 
+0

'{{#each block as model.blocks}}' должно быть '{{#each model.blocks as | block |}}' –

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