我想使用Ember在我的服务器上查询此网址http://localhost:1337/api/posts/count?category=technology
。我使用默认的RESTAdapter,如下所示:
export default DS.RESTAdapter.extend({
coalesceFindRequests: true,
namespace: 'api',
)};
Post模型如下所示:
import DS from 'ember-data';
var Post = DS.Model.extend({
title: DS.attr('string'),
permalink: DS.attr('string'),
body: DS.attr('string')
});
export default Post;
我如何提出这样的要求?
答案 0 :(得分:3)
我认为当您无法控制后端时,至少有两种方法可以实现这一目标。否则,您仍然可以使用RESTful API(请参阅我的答案的最后一部分)。
第一个是使用现有的RESTAdapter
功能,只覆盖buildURL
方法:
var PostAdapter = DS.RESTAdapter.extend({
namespace: 'api',
buildURL: function(type, id, record) {
var originalUrl = this._super(type, id, record);
if (this._isCount(type, id, record)) { // _isCount is your custom method
return originalUrl + '/count';
}
return originalUrl;
}
});
您在_isCount
方法中的位置(例如根据record
属性)是否符合您的要求。然后,您可以使用商店传递参数:
this.store.find('post', {
category: technology
});
第二种方法是覆盖整个findQuery
方法。您可以使用上述DS.RESTAdapter
或仅使用DS.Adapter
。代码如下所示:
var PostAdapter = DS.Adapter.extend({
namespace: 'api',
findQuery: function(store, type, query) {
// url be built smarter, I left it for readability
var url = '/api/posts/count';
return new Ember.RSVP.Promise(function(resolve, reject) {
Ember.$.getJSON(url, query).then(function(data) {
Ember.run(null, resolve, data);
}, function(jqXHR) {
jqXHR.then = null;
Ember.run(null, reject, jqXHR);
});
});
},
});
并且您也使用上一个示例中的商店:
this.store.find('post', {
category: technology
});
meta
如果您对后端有完全控制权,则可以利用metadata的强大功能。
服务器响应将是:
// GET /api/posts/:id
{
"post": {
"id": "my-id",
"title": "My title",
"permalink": "My permalink",
"body": "My body"
},
"meta": {
"total": 100
}
}
然后您可以从以下位置获取所有元信息:
this.store.metadataFor("post");
同样,您可以在获取/api/posts
的所有帖子时使用此方法。
我希望它有所帮助!