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 6

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:

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);
  }

});
Разница здесь в том, что я переключаю хэш в цикле for на property и передаю hash в супер. Может быть, это ошибка с Ember Data 1.0 Beta?