Tengo problemas para guardar un formulario en una tienda. El formulario carga un registro para editar un registro existente o está en blanco para un nuevo registro. La edición de un registro existente funciona bien. Crear uno nuevo también funciona bien. Tengo problemas si quiero editar y actualizar un registro recién creado sin cerrar y volver a abrir el formulario.

Supongo que el problema es que la identificación del registro dentro de la tienda se asigna a través del servidor remoto. El formulario contiene una copia del modelo y no toma en cuenta el cambio de identificación.

¿Alguna idea de cómo mantener sincronizados el formulario y la tienda?

El siguiente código se utiliza para guardar:

var basicForm = this.up('form').getForm(),
record = basicForm.getRecord();

if (basicForm.isValid()) {

    if (!record) {
        record = Ext.data.StoreManager.lookup('theModel').add( this.up('form').getForm().getFieldValues())[0];
        basicForm.loadRecord(record);
    } else {
        basicForm.updateRecord(record);
    }
}
1
Manuel 16 nov. 2011 a las 14:35
1
Puede agregar un oyente para el evento de escritura en la tienda y actualizar el ID de registro para la instancia que tiene en el formulario allí.
 – 
VoidMain
16 nov. 2011 a las 16:08
Hey VoidMain, yo también pensé en eso. ... var record = nuevo app.model.newModel (basicForm.getFieldValues ​​()); record.save ({éxito: función () {consola.log (esto)}}); ... desafortunadamente, todavía obtengo el registro antiguo, no el nuevo registro actualizado con la identificación asignada
 – 
Manuel
16 nov. 2011 a las 16:28
Pero gracias por la pista, ¿sabes cómo implementarlo?
 – 
Manuel
16 nov. 2011 a las 16:34
Claro, déjame darte un ejemplo rápido.
 – 
VoidMain
16 nov. 2011 a las 18:49

1 respuesta

La mejor respuesta

Para continuar con su ejemplo, puede escuchar el evento de escritura en la tienda:

var basicForm = this.up('form').getForm(),
record = basicForm.getRecord(), 
store = Ext.data.StoreManager.lookup('theModel'); // We'll add a field for simplicity
store.on('write', onTheModelWrite);

if (basicForm.isValid()) {

    if (!record) {
        record = Ext.data.StoreManager.lookup('theModel').add(this.up('form').getForm().getFieldValues())[0];
        basicForm.loadRecord(record);
    } else {
        basicForm.updateRecord(record);
    }
}

var onTheModelWrite = function(s, o)//Here Ext passes the store and the options passed to save()
{
    record = s.getAt( s.indexOf(record) ); //We use getAt() because we don't know the id
    basicForm.loadRecord(record);
}

Deberías poner todo esto en el ámbito, por supuesto, pero, con suerte, ya entiendes la idea.

1
VoidMain 16 nov. 2011 a las 18:58
Obteniendo un error en la línea de basicForm.loadRecord (registro); y no entiendo por qué ... Error de tipo no detectado: no se pueden leer los 'datos' de propiedad de Ext.define.loadRecordext-all-dev.js: 95393 (función anónima) xyz.js: 64 fireext-all-dev.js : 16807 Ext.define.fireEventext-all-dev.js: 21000 Ext.define.onProxyWrite
 – 
Manuel
17 nov. 2011 a las 03:50
¿Después de s.getAt(..)? si está ahí, entonces probablemente su campo 'registro' esté fuera de alcance y, por lo tanto, la tienda no pueda encontrarlo, agregue un console.info(record); antes de s.getAt para que sepa lo que tiene allí.
 – 
VoidMain
18 nov. 2011 a las 18:15