2010-07-18 19 views
27

Actualmente estoy teniendo problemas para volver a cargar una tienda json con nuevos parámetros. Aquí está mi tienda:Recargar una tienda json con nuevos parámetros ExtJs Ext.data.JsonStore

newsletters = new Ext.data.JsonStore({ 
     url: '/newsletters/', 
     root: 'results', 
     fields: [ 
      'id', 
      'body' 
      'recipients' 
     ], 
     baseParams: { command: 'json', to: dateTo, from: dateFrom }, 
    autoLoad: true 
    }); 

dateTo y dateFrom son digan cadenas vacías ('') y en el registro firebug/boletines se llama con los parámetros correctos.

Ahora ninguno de los siguientes trabajos Techniquest:

Cambio de los valores de dateTo y luego llamar dateFrom newsletters.reload() todavía llama a la página con los parámetros a y de ser cadenas vacías.

Llamando a newsletters.reload({ to: 'test1', from: 'test2' }); todavía ve los parámetros como cadenas vacías.

Por último, a partir del manual que he intentado:

lastOptions = newsletters.lastOptions; 
Ext.apply(lastOptions.params, { 
    to: 'test1', 
    from: 'test2' 
}); 
newsletters.reload(lastOptions); 

De nuevo, esto no solicita/boletines con los parámetros actualizados.

Cualquier consejo apreciado!

+0

No sé si es importante o no .. pero falló un ',' 'después 'body'' en el' fields' – Lipis

Respuesta

5

De la documentación, es probable que pueda hacer:

store.setBaseParam('to', dateTo); 

Ahora, si he entendido bien, quiere que su baseParams a cambiarse cada vez que se cambian dateTo y dateFrom.

Usted podría intentar:

var dateTo = '', dateFrom = ''; 

store.on('beforeload', function(s) { 
    s.setBaseParam('to', dateTo); 
    s.setBaseParam('from', dateFrom); 
}); 

// This should work : 
dateTo = 1; 
dateFrom = 2; 
store.load(); 
29

en realidad se puede pasar objeto params al método de carga()

newsletters.load({ 
    params: {to: 'test1', from: 'test2'} 
}) 
+0

1, por la respuesta . –

4

Mi problema: Tengo una tienda que deberá solicitar datos a través de un proxy para back-end. Esta solicitud debe contener un parámetro denominado filter, que ayudará al back-end a decidir cuál es el conjunto de resultados que le interesa al cliente. Este parámetro se carga desde Combobox o algún otro componente que el usuario puede usar para expresar qué filtro deberia ser usado.

Desde mi punto de vista, los parámetros no deben establecerse en la Tienda y tampoco usar el parámetro de carga. Explicaré por qué:

  1. La configuración de los parámetros en la tienda implicaría que todos los demás componentes que usen la misma tienda tendrán estos parámetros configurados, lo que significa que puede haber problemas de concurrencia.
  2. Y en el segundo caso, no es interesante tenerlo configurable sobre el método de carga, porque no quiere utilizar explícitamente cada vez el método load solo, recuerde que ya hay algunos componentes como paginación y componentes personalizados que desencadenan este método.

¿Cuál sería la manera correcta desde mi punto de vista:

Cada vez que se activa una load, que solo conectar el parámetro adicional en una forma no intrusiva.Lo que significa que el desencadenador no necesitará tener ningún cambio (recuerde que el desencadenador podría ser cualquier componente que ejecute store.load()) y el almacén no debe tener conocimiento de este nuevo parámetro.

Aquí puede ver claramente que se tratará de una operación realizada antes de solicitar los datos al proxy, y en mi caso lo implementé como un detector para el evento beforeload. Cuando se ejecuta beforeload, solo agrego los nuevos parámetros al parámetro de operación del oyente que según documentation es: beforeload(store, operation, eOpts). La aplicación final es algo así como:

store.on({ 
    beforeload: function (store, operation, opts) { 
     Ext.apply(operation, { 
      params: { 
       filterName: Ext.getCmp('filterCombo').getValue() 
      } 
     }); 
    } 
}); 
Cuestiones relacionadas