我认为当您无法控制后端时,您至少有两种方法可以实现这一目标。否则,您仍然可以使用 RESTful API(请参阅我回答的最后一部分)。
覆盖 buildURL
第一种是使用现有的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 属性)是否是您想要的。然后,您可以使用 store 传递参数:
this.store.find('post', {
category: technology
});
覆盖 findQuery
第二种方法是覆盖整个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 获取所有帖子时使用此方法。
希望对你有帮助!