Ember data 1.0.0: путать с адаптерами и сериализаторами для каждого типа
Я мигрирую с Ember data 0.13 на 1.0.0 beta. Согласно Доку https://github.com/emberjs/data/blob/master/TRANSITION.md , теперь существуют адаптеры для каждого типа и сериализаторы для каждого типа.
Это означает, что я больше не могу определить "myRestAdapter" с некоторыми конкретными переопределениями для первичного ключа и аутентификации. Теперь мне нужно реализовать этот код для каждого типа модели, что приведет к дублированию xx раз одного и того же кода.Код в данных Ember 0.13:
App.AuthenticatedRestAdapter = DS.RESTAdapter.extend({
serializer: DS.RESTSerializer.extend({
primaryKey: function() {
return '_id';
}
}),
ajax: function (url, type, hash) {
hash = hash || {};
hash.headers = hash.headers || {};
hash.headers['Authorization'] = App.Store.authToken;
return this._super(url, type, hash);
}
});
Код в Ember data 1.0.0 (только для установки первичного ключа на _id вместо _id:
App.AuthorSerializer = DS.RESTSerializer.extend({
normalize: function (type, property, hash) {
// property will be "post" for the post and "comments" for the
// comments (the name in the payload)
// normalize the `_id`
var json = { id: hash._id };
delete hash._id;
// normalize the underscored properties
for (var prop in hash) {
json[prop.camelize()] = hash[prop];
}
// delegate to any type-specific normalizations
return this._super(type, property, json);
}
});
Правильно ли я понял, что мне нужно скопировать этот же блок теперь для каждой модели, которая требует _id в качестве первичного ключа ? Больше нет способа указать это один раз для всего приложения ?
4 ответа:
Поскольку код должен быть
type
агностическим, почему бы вам просто не создать свой собственный сериализатор, из которого ваши модели могут расширяться, что-то вроде:App.Serializer = DS.RESTSerializer.extend({ normalize: function (type, hash, property) { // property will be "post" for the post and "comments" for the // comments (the name in the payload) // normalize the `_id` var json = { id: hash._id }; delete hash._id; // normalize the underscored properties for (var prop in hash) { json[prop.camelize()] = hash[prop]; } // delegate to any type-specific normalizations return this._super(type, json, property); } });
И затем используйте
App.Serializer
для всех ваших моделей:App.AuthorSerializer = App.Serializer.extend(); App.PostSerializer = App.Serializer.extend(); ...
Надеюсь, это поможет.
Можно также задать
App.ApplicationSerializer
. Это будет работать, если вы хотите, чтобы эта нормализация применялась к каждой модели.App.ApplicationSerializer = DS.RESTSerializer.extend({ normalize: function (type, property, hash) { var json = { id: hash._id }; // ... return this._super(type, property, json); } });
Я действительно не знаю, рекомендуется ли это, но поскольку мне нужно, чтобы первичный ключ был "_id" для каждой модели, я просто сделал это:
DS.JSONSerializer.reopen({ primaryKey: '_id' });
Я обнаружил, что это работает с идентификаторами первичного ключа _id:
Разница здесь в том, что я переключаю хэш в цикле for наMediaUi.ApplicationSerializer = DS.RESTSerializer.extend({ normalize: function (type, property, hash) { // property will be "post" for the post and "comments" for the // comments (the name in the payload) // normalize the `_id` var json = { id: hash._id }; delete hash._id; // normalize the underscored properties for (var prop in property) { json[prop.camelize()] = property[prop]; } // delegate to any type-specific normalizations return this._super(type, json, hash); } });
property
и передаюhash
в супер. Может быть, это ошибка с Ember Data 1.0 Beta?