Ember.js async hasMany中的查询参数通过链接
使用余烬数据,您可以执行以下操作:Ember.js async hasMany中的查询参数通过链接,ember.js,ember-data,Ember.js,Ember Data,使用余烬数据,您可以执行以下操作: App.Post = DS.Model.extend({ comments: DS.hasMany('comment', {async:true}) }); 通过链接-对象,您可以从服务器返回或序列化负载客户端,如下所示: { post:{ id: 1, links: { comments: 'comments' } } } 当您执行post.get('comments') 但是我得到了很多评论,我想把查询
App.Post = DS.Model.extend({
comments: DS.hasMany('comment', {async:true})
});
通过链接
-对象,您可以从服务器返回或序列化负载客户端,如下所示:
{
post:{
id: 1,
links: {
comments: 'comments'
}
}
}
当您执行post.get('comments')
但是我得到了很多评论,我想把查询参数传递给它(就像在余烬数据中的普通搜索一样):post.get('comments',{from:'2014-01-01',to:'2014-01-07')代码>
不幸的是,它不起作用。还有别的办法吗
另请参见我的另一个实现这一点的方法有很多,我将列出所有方法,然后再决定哪种方法最好
更改从服务器返回的json(可能是最正确的)
例如:
在收到json时修改序列化程序中的json
例如:
在某些情况下,修改适配器中的请求以包含额外信息
示例:我必须解决这个问题。我找不到一个干净的解决方案,看着Ember Data的源代码,我无法想象有更好的解决方案。也许这会帮助其他人
给定这样的关系,并且需要传递查询参数来告诉API需要返回哪些注释(例如,需要包含“搜索”参数或“页码”/“页面大小”以进行分页)
我在hasMany属性的options对象中添加了一个键“params”。该值告诉适配器还有哪些模型属性包含与hasMany关系相关的参数。(请注意,“对象”不是默认的数据属性类型,请参见添加该类型。)
修改模型以提供查询参数后,我们需要适配器来使用信息:
App.ApplicationAdapter = DS.RESTAdapter.extend({
findHasMany: function(store, snapshot, url, relationship) {
var id = snapshot.id;
var type = snapshot.typeKey;
url = this.urlPrefix(url, this.buildURL(type, id));
if ('params' in relationship.options) {
var params = snapshot.attr(relationship.options.params);
if (params && Em.keys(params).length) {
var queryParams = [];
_.forEach(params, function (value, key) {
queryParams.push(
'%@=%@'.fmt(encodeURIComponent(key), encodeURIComponent(value))
);
});
url = url + '?' + queryParams.join('&');
}
}
return this.ajax(url, 'GET');
},
});
现在,您可以使用路由/控制器中的操作或控制器中的观察者来修改params属性,然后对hasMany属性调用get()或reload():
// some controller ...
// assume a template with binding to 'query'
queryDidChange: function() {
var model = this.get('model');
var params = model.getWithDefault('comment_params', {});
var value = this.get('query').trim();
if (value !== '') {
params['search'] = value;
} else {
delete params['search'];
}
model.set('comment_params', params);
// calling reload to get a new set of comments
// if comments have not been loaded yet only the 'get' is
// necessary.
model.get('comments').reload();
}.observes('query'),
社论:
我真的希望我不需要添加所有这些代码,但是似乎返回hasMany的所有记录是默认的,没有现成的方法来修改它
编辑#2:我使用lodash中的“_.forEach”。你也可以使用
Object.keys(params).forEach($same_foreach_function_as_above)
我已经编写了一个插件来实现这一点:
安装和配置后,您应该能够查询:
post.query('comments',{from'2014-01-01',to'2014-01-07'})
感谢您提供的所有选项,我意识到将注释映射为具有许多
-关系不是正确的方法,因为我需要在服务器上查询它。我应该为我的另一个问题寻找另一个解决方案。我接受这个答案,因为从技术上讲,你确实回答了我的问题。@Kingpin2k,我问了同样的问题,这个答案的问题是你给出了示例foo=bar
,但我需要动态地传递参数,不仅仅是bar
,还需要分页:foo=page1
,foo=page2
,等等,你能回答我的问题吗。
App.Post = DS.Model.extend({
comments: DS.hasMany('comment', {async:true})
});
App.Post = DS.Model.extend({
comments: DS.hasMany('comment', {async:true, params: 'comment_params'}),
comment_params: DS.attr('object'),
});
App.ApplicationAdapter = DS.RESTAdapter.extend({
findHasMany: function(store, snapshot, url, relationship) {
var id = snapshot.id;
var type = snapshot.typeKey;
url = this.urlPrefix(url, this.buildURL(type, id));
if ('params' in relationship.options) {
var params = snapshot.attr(relationship.options.params);
if (params && Em.keys(params).length) {
var queryParams = [];
_.forEach(params, function (value, key) {
queryParams.push(
'%@=%@'.fmt(encodeURIComponent(key), encodeURIComponent(value))
);
});
url = url + '?' + queryParams.join('&');
}
}
return this.ajax(url, 'GET');
},
});
// some controller ...
// assume a template with binding to 'query'
queryDidChange: function() {
var model = this.get('model');
var params = model.getWithDefault('comment_params', {});
var value = this.get('query').trim();
if (value !== '') {
params['search'] = value;
} else {
delete params['search'];
}
model.set('comment_params', params);
// calling reload to get a new set of comments
// if comments have not been loaded yet only the 'get' is
// necessary.
model.get('comments').reload();
}.observes('query'),
Object.keys(params).forEach($same_foreach_function_as_above)