ember应用程序具有以下模型。
App.Book = DS.Model.extend
title = DS.attr('string')
pages = DS.attr('number')
chapters = DS.hasMany('bookChapter')
App.BookChapter = DS.Model.extend
title = DS.attr('string')
begin = DS.attr('number')
end = DS.attr('number')
我注意到App.Book向/ api / books和App.BookChapter请求/ api / bookChapters 有什么方法可以向/ api / books / {id} / chapter或/ api / book_chapters提出请求吗?book = {id}
我需要这个才能工作,因为我无权更改api端点网址。
我的ember.js环境是
DEBUG: Ember : 1.5.0
DEBUG: Ember Data : 1.0.0-beta.7+canary.f482da04
DEBUG: Handlebars : 1.3.0
DEBUG: jQuery : 1.11.0
答案 0 :(得分:0)
适配器负责将存储操作转换为持久层。
由于您未遵循RESTAdapter约定,因此您需要创建自定义适配器以与特定API进行通信。最简单的方法是扩展RESTAdapter,其实现对您的API是关闭的。
App.ApplicationAdapter= DS.RESTAdapter.extend({
namespace: 'api',
pathForType: function(type) {
var decamelized = Ember.String.decamelize(type);
return Ember.String.pluralize(decamelized);
},
findQuery: function(store, type, query) {
var params = [];
Object.keys(query).forEach(function (key) {
var param = key+'='+encodeURIComponent(query[key]);
params.push(param);
});
params = params.join('&');
var url = this.buildURL(type.typeKey);
url = [url, params].join('/?');
return this.ajax(url, 'GET');
}
});
我已经写了findQuery,因为你没有通过模型主键查询find('bookChapter',1)。然后你将请求作为:
App.ChapterRoute = Ember.Route.extend({
model: function(params) {
return this.store.find('bookChapter', {book: params.book_id});
}
});
如果您的API不同于通信或序列化惯例,则需要扩展RESTSerializer或RESTAdapter(检查DOC以了解应覆盖哪些方法)。