Попросите две модели вместе - программирование
Подтвердить что ты не робот

Попросите две модели вместе

У меня есть две модели, многие из которых. Они используются на первой странице моего приложения, и у меня возникают проблемы с их загрузкой.

Обе модели имеют только несколько элементов (< 200), и я хотел бы просто загрузить обе модели полностью одним запросом findAll. Но по мере загрузки первой модели, Ember начинает получать отсутствующие данные для второй модели, по элементам. Если я попытаюсь просто загрузить модели отдельно, я получаю сообщение об ошибке и должен установить {async:true} для hasMany attr. По какой-то причине Ember не распознает json запросов для второй модели.

Есть ли какой-либо способ получить обе модели и дождаться загрузки обоих файлов?

Спасибо.

4b9b3361

Ответ 1

Я предполагаю, что вы делаете что-то вроде:

App.IndexRoute = Ember.Route.extend({
  model: function() {
    // Fetch the records of the first model 
    return this.store.find('post');
  },

  setupController: function(controller, model) {
    this._super(controller, model);
    this.store.find('comment').then(function(comments) {
      controller.set('comments', comments)
    });
  }
});

Любое обещание, возвращенное с крюка model маршрута, приведет к тому, что маршрутизатор приостановит переход до тех пор, пока это обещание не будет выполнено. В приведенном выше случае маршрутизатор будет ждать только для запроса posts для разрешения. Поэтому нам нужно указать маршрутизатору, чтобы он дождался завершения обоих запросов.

Введите Ember.RSVP.all и Ember.RSVP.hash. Эти методы позволяют объединить несколько promises в один. Они возвращают новое обещание, которое выполняется только тогда, когда выполняются все индивидуальные promises. Вот как вы это делаете с помощью Ember.RSVP.hash:

App.IndexRoute = Ember.Route.extend({
  model: function() {
    var store = this.store;
    return Ember.RSVP.hash({
      posts: store.find('post'),
      comments: store.find('comment')
    });
  },

  setupController: function(controller, models) {
    var posts = models.posts;
    var comments = models.comments;

    controller.set('content', posts);
    controller.set('comments', comments);
  }
});