2013-09-01 10 views
6

Ich bin von Ember Daten 0.13 zu 1.0.0 Beta migrieren. Nach dem Dokument https://github.com/emberjs/data/blob/master/TRANSITION.md gibt es jetzt pro Typ Adapter und pro Typ Serialisierer.Ember Daten 1.0.0: verwirrt mit per-Typ Adapter und Serialisierer

Das bedeutet, dass ich einen "myRestAdapter" mit einigen spezifischen Überschreibungen für den Primärschlüssel und die Authentifizierung nicht mehr definieren kann. Ich muss diesen Code nun für jeden Modelltyp implementieren, was dazu führt, dass xx mal der gleiche Code dupliziert wird.

-Code in Ember Daten 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); 
    } 
}); 

-Code in Ember Daten 1.0.0 (nur den Primärschlüssel für die Einstellung statt _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); 
    } 

}); 

Habe ich verstanden es richtig, dass Ich muss diesen gleichen Block jetzt für jedes Modell kopieren, das _id als Primärschlüssel benötigt? Gibt es keine Möglichkeit mehr, dies einmal für die gesamte Anwendung anzugeben?

Antwort

5

Da der Code zu b e type Agnostiker, warum Sie Ihre benutzerdefinierten Serializer erstellen nicht nur, dass Ihre Modelle reichen von können, so etwas wie:

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

}); 

Und dann App.Serializer für alle Modelle verwenden:

App.AuthorSerializer = App.Serializer.extend(); 
App.PostSerializer = App.Serializer.extend(); 
... 

Hoffe, es hilft .

+0

Guter Vorschlag. Wird folgen! Danke. Marc – cyclomarc

+0

Haben Modelle, die keine Pertype-Adapter/Serializer haben, immer noch auf einen Standardadapter/Serializer zurückzugreifen? – mehulkar

+0

@MehulKar Ich habe keine Möglichkeit gefunden, auf einen Standardadapter zurückzugreifen. – cyclomarc

3

Sie können auch App.ApplicationSerializer einstellen. Dies funktioniert, wenn Sie möchten, dass diese Normalisierung auf alle Modell angewendet wird.

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

Ich weiß nicht wirklich, wenn dies empfohlen wird, aber da ich den Primärschlüssel muß „_id“ für jedes Modell sein, ich habe gerade dies:

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

Das hat bei mir funktioniert. Die oben vorgeschlagenen Antworten nicht. – alvincrespo

0

fand ich dies arbeitet mit Primärschlüssel IDs von _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); 
    } 

}); 

der Unterschied ist, dass hier I-Hash in dem for-Schleife property und Weitergabe in hash in die Super-bin Schale. Vielleicht ist das ein Bug mit Ember Data 1.0 Beta?

+0

Ich musste den Schalter tun, weil Hash tatsächlich eine Zeichenkette vom Typ der Daten ist, in meinem Fall "hash" gab "Film" zurück - das ist das Modell, mit dem ich arbeite. – alvincrespo

+0

Mein schlechtes. Ich ging von @inuitivepixel Beispiel ab. Aber die transition.md im Ember-Daten-Repo hat die richtige Reihenfolge. – alvincrespo

Verwandte Themen