Ответ 1
Для данных Ember
Это актуально с Ember Data 1.0 beta 9.
Расширьте один из Ember Data Adapters. Чтобы сделать его сайт широким:
App.ApplicationAdapter = DS.RESTAdapter.extend(....
Чтобы сделать его специфичным для модели:
App.FooAdapter = DS.RESTAdapter.extend(...
Затем вы определите реализацию, которую вы хотите переопределить. У вас всегда есть возможность вызвать this._super
и вернуться к базовой реализации. например.
App.NotesAdapter = DS.RESTAdapter.extend({
find: function(store, type, id) {
id = "foo" + id;
return this._super(store, type, id);
}
});
Или вы можете полностью переопределить реализацию:
App.NotesAdapter = DS.RESTAdapter.extend({
find: function(store, type, id) {
// Do your thing here
return this.ajax(this.buildURL(type.typeKey, id), 'GET');
},
findAll: function(store, type, sinceToken) {
// Do your thing here
var query;
if (sinceToken) {
query = { since: sinceToken };
}
return this.ajax(this.buildURL(type.typeKey), 'GET', { data: query });
},
findQuery: function(store, type, query) {
// Do your thing here
return this.ajax(this.buildURL(type.typeKey), 'GET', { data: query });
},
findMany: function(store, type, ids, owner) {
return this.ajax(this.buildURL(type.typeKey), 'GET', { data: { ids: ids } });
},
.....
});
Чтобы увидеть полный api, вы можете переопределить: http://emberjs.com/api/data/classes/DS.RESTAdapter.html
Serializer
Часто важнее будет использовать собственный сериализатор для массирования данных в соответствии с конечной точкой отдыха. Вот некоторая полезная информация из переходного документа https://github.com/emberjs/data/blob/master/TRANSITION.md.
Короткий вариант заключается в том, что после завершения запроса Ajax полученная полезная нагрузка отправляется через следующие перехватчики:
- Полезная нагрузка отправляется в extractSingle, если исходный запрос был для одной записи (например, find/save) или extractArray, если исходный запрос был для массива записей (например, findAll/findQuery)
- Поведение этих методов по умолчанию состоит в том, чтобы разделить верхний уровень полезной нагрузки на несколько меньших записей.
- Каждая из этих меньших записей отправляется для нормализации, что может нормализовать запись за раз.
- Наконец, конкретные типы записей могут быть специально нормализованы.
App.PostSerializer = DS.RESTSerializer.extend({ extractSingle: function(store, type, payload, id) { // massage this._super(store, type, payload, id); }, extractArray: function(store, type, payload) { // massage this._super(store, type, payload); }, normalize: function(type, hash, property) { // massage this._super(type, hash, property); } });
- используйте extractSingle и extractArray, когда верхний уровень вашей полезной нагрузки организован иначе, чем Ember Data ожидает
- используйте нормализацию для нормализации суб-хэшей, если все под-хэши в полезной нагрузке могут быть нормализованы одинаково.
- используйте normalizeHash для нормализации определенных суб-хэшей.
- обязательно вызовите super, если вы переопределите extractSingle, extractArray или нормализуете, чтобы остальная цепочка получила вызов.
Перемещение ваших собственных
App.FooAdapter = Ember.Object.extend({
find: function(id){
return $.getJSON('http://www.foolandia.com/foooo/' + id);
}
});
Затем с вашего маршрута или где угодно
App.FooRoute = Ember.Route.extend({
model: function(){
var adapter = App.FooAdapter.create();
return adapter.find(1);
}
});
Теперь я лично добавлю адаптер на маршруты, чтобы облегчить жизнь:
App.initializer({
name: "fooAdapter",
initialize: function (container, application) {
application.register("my:manager", application.FooAdapter);
application.inject("controller", "fooAdapter", "my:manager");
application.inject("route", "fooAdapter", "my:manager");
}
});
Тогда на маршруте вы можете быть более ленивыми и делать:
App.FooRoute = Ember.Route.extend({
model: function(){
return this.fooAdapter.find(1);
}
});
Пример: http://emberjs.jsbin.com/OxIDiVU/676/edit
Вы можете больше узнать об Ember без Ember Data: Эмбер без данных Ember