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?
Tengo exactamente el mismo problema.
Esta falla ha sido reportada en el rastreador de problemas de datos de las brasas. La siguiente PR agrega 2 pruebas fallidas que muestran el problema: https://github.com/emberjs/data/pull/578
Parece que no hay solución ahora mismo.
EDITAR:
sebastianseilund abrió un PR hace 2 días que soluciona tu problema. Eche un vistazo a: https://github.com/emberjs/data/pull/629/files
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'' }
}
});