2011-03-31 21 views

Respuesta

22

Para cambiar valores en la cuadrícula, tendrá que cambiar el valor en la tienda de la grilla. Los datos de la cuadrícula están vinculados a los datos de la tienda, y la cuadrícula se actualizará según sea necesario.

Así que la clave es comprender la API de datos de Dojo y cómo funcionan las tiendas en Dojo. En lugar de manipular los datos directamente en la cuadrícula, manipúlelos en la tienda.

Idealmente, la tienda es su matriz que manipula a medida que se ejecuta la aplicación y no debería necesitar sincronizar la matriz con la cuadrícula. Simplemente use ItemFileWriteStore como su titular de datos a menos que eso no sea posible.

Además, el uso de la API de identidad de datos dojo hace que sea muy sencillo encontrar elementos en la cuadrícula si eso es posible. Suponiendo que sabe cuándo se actualiza, elimina o cambia un elemento en su aplicación, debe poder modificar el almacén de cuadrícula según sea necesario cuando ocurra la acción. Este es definitivamente el enfoque preferido. Si no puede hacer eso, tendrá que hacer una búsqueda general y utilizar la devolución de llamada en conjunto para sincronizar manualmente sus matrices, que serán muy lentas y no se escalarán bien, en cuyo caso también puede crear una nueva tienda. juntos y asignarlo a la red con grid.setStore (myNewStore)

Aquí es un violín con un básico de crear, actualizar y borrar la operación: http://jsfiddle.net/BC7yT/11/

todos estos ejemplos se aprovechan de declarar una identidad al crear el almacenar.

var store = new dojo.data.ItemFileWriteStore({ 
    data: { 
     identifier : 'planet', 
     items: itemList 
    } 
}); 

actualizar un EXISTENTE ARTÍCULO:

//If the store is not in your scope you can get it from the grid 
var store = grid.store; 
//fetchItemByIdentity would be faster here, but this uses query just to show 
//it is also possible 
store.fetch({query : {planet : 'Zoron'}, 
      onItem : function (item) { 

        var humans = store.getValue(item, 'humanPop'); 
        humans += 200; 
        store.setValue(item, 'humanPop', humans); 

       } 
     }); 

insertar un nuevo elemento:

store.newItem({planet: 'Endron', humanPop : 40000, alienPop : 9000}); 
       } catch (e) { 
        //An item with the same identity already exists 
       } 

eliminar un elemento:

store.fetchItemByIdentity({ 'identity' : 'Gaxula', onItem : function (item) { 
    if(item == null) { 
     //Item does not exist 
    } else { 
     store.deleteItem(item); 
    } 
}}); 
7

El siguiente fragmento de código se puede utilizar para actualizar la cuadrícula:

var newStore = new dojo.data.ItemFileReadStore({data: {... some new data ...}); 
var grid = dijit.byId("gridId"); 
grid.setStore(newStore); 

EDIT:

Dogo data grid reference guide (añadir/eliminar filas ejemplo, la actualización de ejemplos de datos de cuadrícula)

0

con esto puedo actualizar una fila específi . este ejemplo es para una red de árbol

var idx = this.treeGrid.getItemIndex(item); 
            if(typeof idx == "string"){ 
             this.treeGrid.updateRow(idx.split('/')[0]); 
            }else if(idx > -1){ 
             this.treeGrid.updateRow(idx); 
            } 
3

(supongo que ya tiene una red de trabajo y que desea cambiar por completo la tienda de la red)

  1. Crear un nuevo almacén de datos con su nuevo valor:

    dataStore = new ObjectStore({ objectStore:new Memory({ data: data.items }) }); 
    

    (los datos son la respuesta de una solicitud de Ajax para mí)

  2. Cambiar el tamaño de su grilla Tore con el nuevo:

    grid.store = dataStore; 
    
  3. Render:

    grid.render(); 
    
2

Esto actualizará cuadrícula tienda y actualizar la vista de la cuadrícula en la última versión del Dojo 1,9

grid.store = store; 
grid._refresh(); 
1

Tenía un EnhancedGrid filtrado en el lado del servidor, que se actualizaba felizmente al cambiar la tienda y se mostraba en las otras respuestas.

Sin embargo, tuve otra EnhancedGrid que no se actualizaría cuando se aplicara un filtro. Puede haber tenido que ver con el hecho de que fue filtrado por el lado del cliente (pero los datos aún provienen del servidor que usa la tienda JsonRest), pero realmente no sé la causa. Eitherway, la solución era refrescarse con el siguiente código:

grid.setFilter(grid.getFilter()); 

Es hacky y extraño, pero si falla todo lo demás ...

Cuestiones relacionadas