ember.js - tipos - validacion de datos en excel personalizada
¿Cuál es el patrón estándar para las validaciones de datos Ember?(estado inválido, becomeDvalid...) (5)
He estado luchando con esto por un tiempo; veamos si alguien puede ayudarme.
Aunque no se menciona explícitamente en el archivo Léame, Ember-Data proporciona algo de soporte de validaciones. Puedes ver eso en algunas partes del código y la documentación:
https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/states.js#L411
https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/states.js#L529
El adaptador REST no agrega soporte de validaciones en sí mismo, pero descubrí que si agrego algo como esto en las llamadas ajax, puedo poner el modelo en un estado "inválido" con el objeto de error que vino del lado del servidor:
error: function(xhr){
var data = Ember.$.parseJSON(xhr.responseText);
store.recordWasInvalid(record, data.errors);
}
Así que puedo acceder fácilmente a lo siguiente:
var transaction = App.store.transaction();
var record = transaction.createRecord(App.Post);
record.set(''someProperty'', ''invalid value'');
transaction.commit()
// This makes the validation fail
record.set(''someProperty'', ''a valid value'');
transaction.commit();
// This doesn''t trigger the commit again.
El caso es que, como puede ver, las transacciones no intentan volver a comprometerse . Esto se explica aquí y aquí .
Entonces, el asunto es: si no puedo reutilizar una confirmación, ¿cómo debo manejar esto? Sospecho que tiene algo que ver con el hecho de que estoy poniendo asintomáticamente el modelo al estado invalid
: al leer la documentación , parece que es algo destinado a las validaciones del lado del cliente. En este caso, ¿cómo debería usarlos?
esto puede parecer una respuesta demasiado simple, pero ¿por qué no crear una nueva transacción y agregarle el registro preexistente? También estoy tratando de descubrir un enfoque de manejo de errores.
también debería considerar escribir esto en el nivel de la tienda en lugar del nivel del adaptador por el bien de la reutilización.
Por alguna razón desconocida, el registro se convierte en parte de la transacción predeterminada de la tienda. Este código funciona para mí:
var transaction = App.store.transaction();
var record = transaction.createRecord(App.Post);
record.set(''someProperty'', ''invalid value'');
transaction.commit()
record.set(''someProperty'', ''a valid value'');
App.store.commit(); // The record is created in backend
El problema es que después de la primera falla, siempre debe usar App.store.commit()
con los problemas que tiene.
Intenté la respuesta de Javier, pero obtengo "Ruta inválida" al hacer cualquier record.set(...)
con el registro en estado inválido. Lo que encontré trabajado fue:
// with the record in invalid state
record.send(''becameValid'');
record.set(''someProperty'', ''a valid value'');
App.store.commit();
Alternativamente, parece que si llamo a record.get(...)
primero, las record.set(...)
subsiguientes de record.set(...)
funcionan. Esto es probablemente un error. Pero la solución de trabajo anterior funcionará en general para poder volver a confirmar el mismo registro incluso sin cambiar ninguna propiedad. (Por supuesto, si las propiedades siguen siendo inválidas, volverá a fallar).
Tengo una solicitud de extracción pendiente que debería arreglar esto
Eche un vistazo a esta idea. Es el patrón que uso en mis proyectos.