2013-09-01 1 views
6

Я переношу данные Ember с 0.13 до 1.0.0 beta. Согласно документу https://github.com/emberjs/data/blob/master/TRANSITION.md, теперь существуют адаптеры каждого типа и сериализаторы каждого типа.Ember data 1.0.0: путают с адаптерами и сериализаторами каждого типа

Это означает, что я больше не могу определить «myRestAdapter» с некоторыми определенными переопределениями для первичного ключа и аутентификации. Мне нужно реализовать этот код для каждого типа модели, что приводит к дублированию xx раз в том же коде.

Код в данном Посте 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); 
    } 
}); 

код в Эмбере 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 как первичный ключ? Нет ли способа указать один раз для всего приложения?

ответ

5

Поскольку код швов до b е 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(); 
... 

Надеется, что это помогает ,

+0

Хорошее предложение. Будет следовать этому! спасибо. Marc – cyclomarc

+0

У моделей, у которых нет адаптеров/сериализаторов pertype, которые все еще относятся к адаптеру/сериализатору по умолчанию? – mehulkar

+0

@MehulKar Я не нашел возможности отступить к адаптеру по умолчанию. – cyclomarc

3

Вы также можете установить App.ApplicationSerializer. Это будет работать, если вы хотите, чтобы эта нормализация применялась к каждой модели.

App.ApplicationSerializer = DS.RESTSerializer.extend({ 
    normalize: function (type, property, hash) { 
    var json = { id: hash._id }; 
    // ... 
    return this._super(type, property, json); 
    } 
}); 
3

Я не знаю, если это рекомендуется, но так как мне нужен первичный ключ, чтобы быть «_id» для каждой модели, я просто сделал это:

DS.JSONSerializer.reopen({ 
    primaryKey: '_id' 
}); 
+0

Это сработало для меня. Вышеупомянутые ответы не дали. – alvincrespo

0

Я нашел, что это работа с первичными ключевыми идентификаторами _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); 
    } 

}); 

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

+0

Мне пришлось сделать переключатель, потому что хеш на самом деле является строкой типа данных, в моем случае 'hash' возвращал« фильм »- это модель, с которой я работаю. – alvincrespo

+0

Мой плохой. Я ушел из примера @intuitivepixel. Но переход.md на ember data repo имеет правильный порядок. – alvincrespo

Смежные вопросы