2015-09-23 3 views
0

Я изучаю, как использовать обещания Ember с асинхронными маршрутами и немного спотыкаться здесь. Если я пишу свой маршрут так:Возвращающийся словарь обещаний для асинхронного маршрута EmberJS

App.ActivitiesRoute = Ember.Route.extend({ 
    model: function() { 
     return getClient().getActivities() 
    } 
}); 

Где getActivities() возвращает Ember.RSVP.Promise типа, я могу использовать в шаблоне:

{{#each activity in model}} 

Однако я не хотел бы иметь всю мою базовую модель прокормиться из единственный атрибут. Когда я пытаюсь это:

App.ActivitiesRoute = Ember.Route.extend({ 
    model: function() { 
     return { 
      activities: getClient().getActivities() 
     } 
    } 
}); 

И изменить шаблон:

{{#each activity in model.activities}} 

Я получаю сообщение об ошибке:

"Uncaught Error: Assertion Failed: The value that #each loops over must be an Array. You passed {_id: 82, _label: undefined, _state: undefined, _result: undefined, _subscribers: }" 

И я не знаю, как вернуть имени коллекция Promises, доступ к которой можно получить индивидуально в моем шаблоне.

ответ

1

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

model() { 
    return Ember.RSVP.Promise.hash({ 
    activities: getClient().getActivities() 
    }); 
} 

Это обещание будет решить на хэш, который выглядит как { activities: activities }. Помните, что при прочих равных условиях это будет установлено как свойство model вашего контроллера. Поэтому в контроллере и в шаблонах вам нужно будет обратиться к model.activities.

Если вы хотите ждать несколько асинхронных вызовов (например, несколько звонков this.store), чтобы закончить до перехода продолжить, вы можете использовать один и тот же хэш-подход в вашей модели крючке:

model() { 
    return Ember.RSVP.Promise.hash({ 
    activities: getClient().getActivities(), 
    toys: this.store.findQuery('toy', type }) 
    }); 
} 

, а затем установите «основной» один как model на контроллере в setupController:

setupController(controller, model) { 
    controller.set('model', model.activities); 
} 

в некоторых случаях, более простой подход должен был бы получить основную модель в model крюк, и использовать afterModel для извлечения и ожидания дополнительной модели.

+0

Спасибо - функция 'hash' была именно тем, что я искал. –

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