2015-04-16 3 views
1

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

Я не используя model, beforeModel или afterModel крюки, потому что:

  1. не должны реализовать loading маршруты/шаблоны
  2. я могу загружать каждую модель самостоятельно на странице (например, ленивых нагрузка)

Я использую setupController крюк в моем маршруте, как так:

setupController: function(controller, model) { 
     var that = this; 

     controller.set('model', { 
      stations: that.store.find('station'), 
      packages: that.store.find('package'), 
     }); 
} 

Мой контроллер - Ember.Controller.

Для того, чтобы перебирать эти модели рулей я должен использовать model.stations.content.content, который заставляет меня думать, что я делаю что-то неправильно:

{{#each station in model.stations.content.content}} 
// ..... 
{{/each}} 

Есть ли лучший способ установить эти модели на контроллере или использовать другой тип контроллера или что-то еще?

ответ

1

Вы можете изменить свою модель, чтобы вернуть Ember.RSVP.hash, который будет действовать как обещания мешок а, так и в рамках хэша вы заполните атрибуты stations и packages с вашими данными, поэтому, когда модель получает решена он будет установлен что хэш-схема в качестве модели в контроллере:

[...] 
model: function() { 
    return Em.RSVP.hash({ 
     stations: this.store.find('station'), 
     packages: this.store.find('package') 
    }); 
} 
[...] 

Затем в шаблоне:

{{#each item in model.stations}} 
    <li>{{item.name}}</li> 
{{/each}} 

или

{{#each item in model.packages}} 
    <li>{{item.name}}</li> 
{{/each}} 

(см jsbin)

+0

Я сделал это раньше, но мои модели огромны совершающими загрузки страницы действительно медленно, и именно поэтому я дал объяснение, почему я не использовал крючки 'model' в вопросе – blisstdev

1

Вам не нужно создавать новый объект для вашей модели.

Вы можете сделать следующее в контроллере:

setupController: function(controller, model){ 
    controller.set('model', model); 
    this.stations().then(function(value){ 
    controller.set('stations', value); 
    }); 
} 

Где станций:

stations: function() { 
    return this.store.find('station'); 
} 

Затем вы можете использовать stations в шаблоне таким же образом, как вы могли бы использовать модель. Отъезд this example

Но контроллер должен действительно только украшать одну модель, вы можете подумать о создании вложенных маршрутов (что даст вам вложенные контроллеры).

+0

wow спасибо за пример и все! Я все еще сталкиваюсь с той же проблемой, используя крючок модели, где, если потребуется некоторое время для загрузки, я получу пустой экран или должен реализовать шаблон загрузки. ОДНАКО, ваш метод загрузки модели в магазин ПЕРЕД установкой на контроллер сделал трюк! – blisstdev

2

@ Метод MilkyWayJoe определенно правильный способ сделать это, если вы понимаете, что если у вас большая модель или ваши запросы AJAX занимают много времени, ваш пользовательский интерфейс будет пустым и Ember will try to find a loading process во время загрузки модели.

@Chaosekie предложил ответ на мой вопрос, который должен был дождаться обещания загрузить модель из магазина, чтобы выполнить , затем установить свойство на контроллере.

I.e. в route:

setupController: function(controller, model) { 
     this.store.find('station').then(function(stations) { 
      controller.set('stations',stations); 
     }); 
     this.store.find('package').then(function(packages) { 
      controller.set('packages', packages); 
     }); 
} 

Это позволяет перебирать оба моделей с помощью «нормального» пути в Рулях:

{{#each package in packages}} 
// .... 
{{/each}} 

{{#each station in stations}} 
// .... 
{{/each}} 
Смежные вопросы