javascript - data - jsonserializer ember
Ember js: la relación de Hasmany se rompe después de actualizar otras tablas (2)
Estoy usando Ember.js con local-storage-adapter. Tengo un problema extraño al actualizar los registros.
Tengo un modelo de publicaciones y comentarios con muchas relaciones:
App.Post = DS.Model.extend({
title: DS.attr(''string''),
comments: DS.hasMany(''comment'', {
async: true
})
});
App.Comment = DS.Model.extend({
message: DS.attr(''string'')
});
Estos son mis controladores de publicaciones y comentarios:
App.PostsController = Ember.ArrayController.extend({
newTitle: '''',
actions: {
create: function() {
var title = this.get(''newTitle'');
var post = this.store.createRecord(''post'', {
title: title
});
this.set(''newTitle'', '''');
post.save();
}
}
});
App.CommentsController = Ember.ArrayController.extend({
needs: "post",
post: Ember.computed.alias("controllers.post.model"),
newMessage: '''',
actions: {
create: function() {
var message = this.get(''newMessage'');
var comment = this.store.createRecord(''comment'', {
message: message
});
var post = this.get(''post'');
var comments = post.get(''comments'');
if (comments.get(''content'') == null) comments.set(''content'', []);
comments.pushObject(comment);
comment.save();
post.save();
}
}
});
Al crear registros hasMany relaciones actualizadas correctamente.
{
"App.Post": {
"records": {
"0v66j": {
"id": "0v66j",
"title": "post1",
"comments": ["p31al", "tgjtj"]
}
}
},
"App.Comment": {
"records": {
"p31al": {
"id": "p31al",
"message": "comment 1"
},
"tgjtj": {
"id": "tgjtj",
"message": "comment 2"
}
}
}
}
El problema ocurrió mientras editaba la publicación. Las relaciones se han ido después de editar el registro de la publicación. Hice una búsqueda y encontré este código:
DS.JSONSerializer.reopen({
serializeHasMany: function(record, json, relationship) {
var key = relationship.key;
var relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship);
// alert(relationshipType);
if (relationshipType === ''manyToNone'' || relationshipType === ''manyToMany'' || relationshipType === ''manyToOne'') {
json[key] = Ember.get(record, key).mapBy(''id'');
// TODO support for polymorphic manyToNone and manyToMany
// relationships
}
}
});
Esto hizo el truco y funcionó bien. Pero ahora tengo otro problema. Si edito cualquier otro registro, todas las referencias de identificación son reemplazadas por un objeto completo como este:
{"App.Post":{"records":{"0v66j":{"id":"0v66j","title":"post2","comments":[**{"message":"comment 1"},
{"message":"comment 2"}**]},"8nihs":{"id":"8nihs","title":"post3","comments":["b4v2b","dbki4"]}}},
"App.Comment":{"records":{"p31al":{"id":"p31al","message":"comment 1"},"tgjtj":{"id":"tgjtj","message":"comment 2"},
"b4v2b":{"id":"b4v2b","message":"comments3"},"dbki4":{"id":"dbki4",
"message":"comments4"}}}}
Los refrences de comentarios deben ser comentarios ": [" p31al "," tgjtj "] como este, pero los ids se reemplazan como" comentarios ": [ {" mensaje ":" comentario 1 "}, {" mensaje ":" comentario 2 " } ]
Cuando se utiliza ApplicationSerializer que extiende LSSerializer, parece funcionar.
Tal vez se arregló desde que se lo preguntaron?
He notado algunas cosas en mi camino con Ember ... y especialmente con Ember-Data.
Una de ellas es cuando trato con asociaciones que he tenido que volver a agregar manualmente en las asociaciones guardando y teniendo que volver a guardar, y uso addObject para las asociaciones en memoria ya que está usando un bit aquí. :)
Tenga en cuenta que esto generalmente solo ocurre cuando estoy actualizando más de un objeto nuevo a la vez. Por ejemplo, si su publicación es nueva y su comentario también es nuevo.
Estoy un poco preocupado de ver el siguiente código en su código base, porque no debería estar allí. Nunca deberías tener objetos nulos o que no sean de matriz en tus asociaciones. No estoy seguro de qué piratería hizo con el Adaptador y por qué era necesario, pero espero que esa no sea la razón:
if(comments.get(''content'') == null)
comments.set(''content'', []);
De todos modos, el siguiente código es cómo probablemente escribiría tu acción de creación. Podría ayudar. Espero que sí.
create: function() {
// get the post for association on the new comment
var post = this.get(''post'');
// get the message to store on the new comment
var message = this.get(''newMessage'');
var comment = this.store.createRecord(''comment'', {
message : message,
post : post
});
comment.save().then(function(savedComment) {
post.get(''comments'').addObject(savedComment);
});
}
Tenga en cuenta que es mucho más simple. En general, si estás haciendo cosas complicadas complicadas, algo anda mal y es hora de volver a lo básico y agregar una cosa a la vez, probando a fondo entre las adiciones. :)
¡Buena suerte!