【问题标题】:Ember 2.x get model's relationships at subroute of that modelEmber 2.x 在该模型的子路由处获取模型的关系
【发布时间】:2016-01-29 15:43:58
【问题描述】:

假设我有两个模型,Author 和 Book。

// models/author.js
DS.Model.extend({
  name: DS.attr(),
  books: DS.hasMany('book')
});


// models/book.js
DS.Model.extend({
  title: DS.attr(),
  author: DS.belongsTo('author')
})

如果有一个端点在 /api/authors/{authorID}/books 能够在一个批处理请求中获取所有作者的书籍,而不是多次调用 /api/books/{bookID},但 ember 似乎不支持这一点。可以使用/api/books?authorID={authorID},但这会失去store 的一些好处。

有没有一种 Ember 惯用的方式来处理 /api/authors/{authorID}/books?同样,目标是能够发出一个批处理请求来获取作者的所有书籍,而不是为作者的hasMany 列表中的每一本书发出一次调用。

对于更多的上下文,我有以下路线结构:

// router.js
...
this.route('authors', function() {
  this.route('author', { path: ':id' }, function() {
    this.route('books');
  });
});
...

在“作者”路径中,我将加载所有作者。我还不想同步加载他们的相关书籍,因为列表可能很庞大,并且不会在这条路线上使用。

author 路由中,我使用已检索到的作者数据(在本例中为姓名)。

books 路由中,我想最终加载作者的所有相关书籍,而不需要为每本书发送一个请求。

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    如果您在书籍路由中使用modelFor(),您可以get() 单个作者的书籍。

    作者作者路线

    model(params) {
      return this.store.find('author', params.id); 
    }
    

    作者作者书籍路线

    model() {
      var author = this.modelFor('authors.show');
      return author.get('books');
    }
    

    这是一个 ember-twiddle:https://ember-twiddle.com/924dd7d31e0984b708f9

    【讨论】:

    • 感谢您的回复。可以简单地return author.get('books'),因为hasMany 关系是承诺。不过,这仍然会为每本书打一个电话到/api/books/{bookID}。从本质上讲,您的方法是我正在采用的方法,我认为这是解决此问题的最佳方法。
    • 简单地返回 author.get('books') 很好。我已经更新了我的答案。
    【解决方案2】:

    RestAdapter 有,但很丑。然后查询为/api/books?ids[]=1&ids[]=2。但是,如果您知道您将需要所有作者的书籍,则可以旁加载它们,并且当您致电 author.get('books') 时,它不会再触发 fetch。

    【讨论】:

    • 感谢您的回复。由于我的数据集很大,所以我不想在加载作者时侧载数据。你说得对,RestAdapter 解决方案也有点丑。
    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多