update ember data createrecord applicationadapter javascript ember.js ember-data has-many

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!