2011-12-21 21 views
6

Por ejemplo, decir que tengo una API de servidor para cargar las personas que maneja peticiones como esta: GET/personas/id = 101,329,27ExtJS 4: ¿Cómo puedo configurar una tienda para cargar modelos para un conjunto específico de ID?

me gustaría construir una tienda (probablemente una clase personalizada que se extiende Ext? .data.Store) que, suponiendo que tenga una lista de identificadores de personas, hace que el proxy haga una solicitud como la que se muestra arriba, de modo que los datos devueltos sean solo para ese subconjunto de personas.

Vi la documentación sobre el filtrado remoto, pero mi preocupación es que para usarla primero necesitaría llamar a store.load() que cargaría todas las personas, luego llamar a filter() para hacer el filtrado remoto. Me gustaría simplemente cargar el subconjunto de personas la primera vez.

¡Gracias por cualquier consejo!

Respuesta

5

Encontré una solución (aunque todavía estoy abierto para escuchar otras ideas).

Primero, puede llamar a la función load() de una tienda con un objeto config que se pasará a una operación. Los documentos de la API para Ext.data.Operation dejan claro que una de las opciones de configuración es para una gran variedad de objetos de filtro, por lo que pueden hacer esto:

var idFilter = Ext.create('Ext.util.Filter', { 
    property: 'id', 
    value: '100,200,300' 
}); 

myStore.load({ 
    filters: [ idFilter ] 
}); 

Esto se traduce en una solicitud en la cadena de consulta URL contiene ?filter=[{"property"%3Aid%2C"value"%3A100,200,300}] (en otras palabras, una versión con codificación URL de [{ property: 'id', value: '100,200,300'}]).

También puede simplemente llamar al myStore.filter('id', '100,200,300') sin haber llamado primero a .load(). Suponiendo que tiene remoteFilter = true en su tienda, esto hará una solicitud con los mismos params de consulta mostrados anteriormente.

Sidenote: puede cambiar la palabra clave utilizada para 'filtro' mediante la configuración de la opción de configuración 'filterParam' para el proxy. Por ejemplo, si filterParam = q, entonces la cadena de consulta se muestra arriba cambia a: ?q=[{"property"%3Aid%2C"value"%3A100,200,300}]

Segunda, puede controlar "estructura" del filtro en la cadena de consulta. En mi caso, no quería algo como filter = {JSON}, como se muestra arriba. Yo quería una cadena de consulta que se parecía a esto: la función ?id=100,200,300 Para ello necesitaba para extender un proxy y anular los getParams por defecto():

Ext.define('myapp.MyRestProxy', { 
    extend: 'Ext.data.proxy.Rest', 

    /** 
    * Override the default getParams() function inherited from Ext.data.proxy.Server. 
    * 
    * Note that the object returned by this function will eventually be used by 
    * Ext.data.Connection.setOptions() to include these parameters via URL 
    * querystring (if the request is GET) or via HTTP POST body. In either case, 
    * the object will be converted into one, big, URL-encoded querystring in 
    * Ext.data.Connection.setOptions() by a call to Ext.Object.toQueryString. 
    * 
    * @param {Ext.data.Operation} operation 
    * @return {Object} 
    * where keys are request parameter names mapped to values 
    */ 
    getParams: function(operation) { 
     // First call our parent's getParams() function to get a default array 
     // of parameters (for more info see http://bit.ly/vq4OOl). 
     var paramsArr = this.callParent(arguments), 
      paramName, 
      length; 

     // If the operation has filters, we'll customize the params array before 
     // returning it. 
     if(operation.filters) { 
      // Delete whatever filter param the parent getParams() function made 
      // so that it won't show up in the request querystring. 
      delete paramsArr[this.filterParam]; 

      // Iterate over array of Ext.util.Filter instances and add each 
      // filter name/value pair to the array of request params. 
      for (var i = 0; i < operation.filters.length; i++) { 
       queryParamName = operation.filters[i].property; 

       // If one of the query parameter names (from the filter) conflicts 
       // with an existing parameter name set by the default getParams() 
       // function, throw an error; this is unacceptable and could cause 
       // problems that would be hard to debug, otherwise. 
       if(paramsArr[ queryParamName ]) { 
        throw new Error('The operation already has a parameter named "'+paramName+'"'); 
       } 

       paramsArr[ queryParamName ] = operation.filters[i].value; 
      } 
     } 

     return paramsArr; 
    } 
}); 
1

También puede obtener su objeto Modelo para cargar un registro de sí mismo. Desde un controlador que puede hacer:

this.getRequestModel().load(requestID,{  //load from server (async) 
     success: function(record, operation) { 
     ..... 
     } 
} 

donde Solicitud es una clase de modelo y requestID es una identificación para mirar hacia arriba. En este escenario, el objeto Model también necesita definir el proxy:

proxy: { 
     type: 'ajax', 
     reader: { 
      type:'json', 
      root: 'data' 
     }, 
     api: { 
      create : 'request/create.json', //does not persist 
      read : 'request/show.json' 
     } 
    } 
Cuestiones relacionadas