validar validacion para nombre formularios formulario ejemplos con codigo campo javascript ember.js ember-data

javascript - validacion - Cómo hacer que las relaciones hasMany incrustadas funcionen con los datos de las brasas



validar formulario javascript onclick (4)

No puedo embedded hasMany para que funcione correctamente con los datos de las brasas.

Tengo algo como esto

App.Post = DS.Model.extend({ comments: DS.hasMany(''App.Comment'') }); App.Comment = DS.Model.extend({ post: DS.hasMany(''App.Post''), name: attr(''string'') });

Y mi API devuelve lo siguiente para GET /post :

[ { id: 1 comments: [{name: ''test''}, {name: ''test2''}] }, ... ]

Necesito enviar esto con POST /post :

[ { comments: [{name: ''test''}, {name: ''test2''}] }, ... ]

Quiero trabajar con los modelos Ember y hacer que hagan las solicitudes apropiadas:

var post = App.store.createRecord(App.Post, hash_post_without_comments); post.get(''comments'').createRecord(hash_comment); App.store.commit(); // This should call the POST api

y

var posts = App.store.find(App.Post); // This should call the GET api

Cuando intento algo como post: DS.hasMany(''App.Post'', {embedded: true}) , el GET está funcionando pero el POST está tratando de hacer un POST para los dos registros, no solo el principal.

EDITAR: Mi caso de uso real

1- Acabo de construir datos de ascuas del maestro

2- Mi adaptador: RESTAdapter

3- El serializador: JSONSerializer

4- Yo agregué

App.MyAdapter.map(''App.Join'', { columns: { embedded: ''always'' } });

5- Mis modelos son:

App.Join = DS.Model.extend({ rowCount: DS.attr(''number''), columns: DS.hasMany(''App.JoinColumn''), }); App.JoinColumn = DS.Model.extend({ join: DS.belongsTo(''App.Join'') });

6- Cuando:

var a = App.Join.find(1); a.get(''columns'').createRecord({}); App.store.commit();

se envía un POST para joincolumn y el padre no está sucio

¿Qué me estoy perdiendo?



En el maestro, la API correcta es:

App.Adapter.map(''App.Post'', { comments: { embedded: ''always'' } });

Los dos valores posibles de embedded son:

  • load : los registros secundarios se incrustan al cargar, pero se deben guardar como registros independientes. Para que esto funcione, los registros secundarios deben tener una identificación.
  • always : los registros secundarios se incrustan al cargar y se guardan incrustados en el mismo registro. Esto, por supuesto, afecta la suciedad de los registros (si el registro secundario cambia, el adaptador marcará el registro principal como sucio).

Si no tiene un adaptador personalizado, puede llamar al map directamente en DS.RESTAdapter :

DS.RESTAdapter.map(''App.Post'', { comments: { embedded: ''always'' } });


Agregando una actualización a esto en caso de que otros encuentren esta publicación y tengan dificultades para descubrir qué funciona con la versión actual de Ember-Data.

A partir de Ember Data 1.0.0.beta.7, debe anular los métodos apropiados en el serializador. Aquí hay un ejemplo:

1) Vuelva a abrir el serializador (crédito a esta publicación ):

DS.RESTSerializer.reopen({ serializeHasMany: function(record, json, relationship) { var hasManyRecords, key; key = relationship.key; hasManyRecords = Ember.get(record, key); if (hasManyRecords && relationship.options.embedded === "always") { json[key] = []; hasManyRecords.forEach(function(item, index) { // use includeId: true if you want the id of each model on the hasMany relationship json[key].push(item.serialize({ includeId: true })); }); } else { this._super(record, json, relationship); } } });

2) Agregue la opción embedded: ''always'' a la relación en el modelo:

App.Post = DS.Model.extend({ comments: DS.hasMany(''comment'', { embedded: ''always'' }) });


Esto es lo que funcionó para mí (Ember 1.5.1 + pre.5349ffcb, Ember Data 1.0.0-beta.7.f87cba88):

App.Post = DS.Model.extend({ comments: DS.hasMany(''comment'', { embedded: ''always'' }) }); App.PostSerializer = DS.ActiveModelSerializer.extend(DS.EmbeddedRecordsMixin, { attrs: { comments: { embedded: ''always'' } } });