Ember.js:加载相关的多个模型



由于ember指南解释了如何在类似的路线上加载多个模型

export default Ember.Route.extend({
  model() {
    return Ember.RSVP.hash({
      songs: this.get('store').findAll('song'),
      albums: this.get('store').findAll('album')
    });
  }
});

我想知道如何从第二个模型中只加载相关的模型条目,比如加载所有歌曲,但只加载歌曲中索引的专辑,如果我们假设歌曲模型包含这个

...
albums: hasMany('album'),
...

我该怎么做?

假设您的适配器和JSON API后端支持它,您可以简单地说:

export default Ember.Route.extend({
  model() {
    return Ember.RSVP.hash({
      songs: this.get('store').findAll('song', { include: 'albums' }),
    });
  }
});

通常,这将生成GET/songs?include=albums,根据http://jsonapi.org/format/#fetching-包括。

在Ember方面,该功能在http://emberjs.com/blog/2016/05/03/ember-data-2-5-released.html#toc_code-ds finder包含代码。

如果以上不是一个选项,那么如果不构建自定义端点并使用store.pushPayload,就无法在一个请求中加载所有内容。

以下是的一种方法

export default Ember.Route.extend({
  model() {
    var promise = new Ember.RSVP.Promise(function(resolve,reject){
      this.store.findAll('song').then(function(songs){
        var albumPromises = songs.map(fuction(s){return s.get('album')});
        Em.RSVP.all(albumPromises).then(function(){
           resolve(songs);
        });
      });
    });
    return promise;
  }
});

所以基本上你是在等待,直到一切都解决了。

希望它能有所帮助!

最新更新