filter paginate将参数传递给异步ember数据关系请求

我想异步实现对ember数据的分页/过滤。

这是我的author模型:

 export default DS.Model.extend({ user: DS.belongsTo('user'), articles: DS.hasMany('article', { async: true }), name: DS.attr('string'), email: DS.attr('string') }); 

路线:

 export default Ember.Route.extend({ model: function(params) { return this.store.find('author', params.author_id); } }); 

控制器:

 export default Ember.ObjectController.extend({ popularArticles: function() { return this.get('model.articles').filter({ tab: 'popular' }); }.property('model.articles') }); 

请注意,模型具有带有DS.hasMany('article', { async: true})关系的articles属性。

如果我使用此属性,则此请求将成为authors/1/articles及其异步。

这很好,直到我需要像authors/1/articles?page=2authors/1/articles?tab="hot"这样的请求。

一种可能的方法是,如控制器中所示,我有一个model.articles属性,用于过滤model.articles属性,并将生成过滤后的请求而不加载所有文章。

如何将查询参数传递给ember数据中的异步加载关系?

这个插件可能会有所帮助: https : //github.com/mdehoog/ember-data-has-many-query 。

允许您将查询参数添加到has-many关系中,例如:

post.query('comments', { page: 1 });

在控制器中,您可以执行以下操作:

 import Ember from "ember"; import pagedArray from 'ember-cli-pagination/computed/paged-array'; export default Ember.ArrayController.extend({ sortProperties: ['date'], sortAscending: false, page: 1, perPage: 5, pagedContent: pagedArray("arrangedContent", {pageBinding: "page", perPageBinding: "perPage"}), queryParams: ["page", "perPage"], totalPagesBinding: "pagedContent.totalPages" }); 

@ peter-t我不知道您搜索的是什么示例,但您可以在这样的组件中进行过滤:

ember-cli-blog/app/components/blog-posts.js

 import Ember from 'ember'; import pagedArray from 'ember-cli-pagination/computed/paged-array'; import computedFilterByQuery from 'ember-cli-filter-by-query/util/filter'; export default Ember.Component.extend({ pagedContent: pagedArray("filteredContent", {pageBinding: "page", perPageBinding: "perPage"}), totalPagesBinding: "pagedContent.totalPages", arrangedContent: function() { return Ember.ArrayProxy.extend(Ember.SortableMixin).create({ sortProperties: ['date'], sortAscending: false, content: this.get('posts') }); }.property('posts'), filteredContent: function() { return computedFilterByQuery( this.get('arrangedContent'), ['title', 'body', 'author', 'excerpt'], this.get('query'), { conjunction: 'and', sort: false} ); }.property('arrangedContent.@each.title', 'arrangedContent.@each.author', 'query'), actions: { createPost: function() { this.sendAction('createAction'); } } }); 

ember-cli-blog/app/templates/posts.hbs

 {{#blog-posts posts=model page=page perPage=perPage query=query createAction="createPost"}}{{outlet}}{{/blog-posts}}