2012-07-09 21 views
6

Tengo una columna del tipo checkcolumn para permitir alternar valores booleanos. Me gustaría poder alternar todas las filas para ese valor a la vez. Idealmente, podría agregar una casilla de verificación al encabezado checkcolumn y escuchar los cambios. ¿Es eso posible?ExtJS 4 seleccionar múltiples casillas de verificación CheckColumn con casillero de casilla de verificación

Me gustaría señalar que no estoy buscando un modelo de casilla de verificación para seleccionar filas.

Respuesta

9

he creado una versión actualizada del Ext.ux.CheckColumn para esto, basta con incluir el código después de que se incluyó el código extjs:

Ext.define('Ext.ux.CheckColumn', { 
    extend: 'Ext.grid.column.Column', 
    alias: 'widget.checkcolumn', 

    disableColumn: false, 
    disableFunction: null, 
    disabledColumnDataIndex: null, 
    columnHeaderCheckbox: false, 

    constructor: function(config) { 

     var me = this; 
     if(config.columnHeaderCheckbox) 
     { 
      var store = config.store; 
      store.on("datachanged", function(){ 
       me.updateColumnHeaderCheckbox(me); 
      }); 
      store.on("update", function(){ 
       me.updateColumnHeaderCheckbox(me); 
      }); 
      config.text = me.getHeaderCheckboxImage(store, config.dataIndex); 
     } 

     me.addEvents(
      /** 
      * @event checkchange 
      * Fires when the checked state of a row changes 
      * @param {Ext.ux.CheckColumn} this 
      * @param {Number} rowIndex The row index 
      * @param {Boolean} checked True if the box is checked 
      */ 
      'beforecheckchange', 
      /** 
      * @event checkchange 
      * Fires when the checked state of a row changes 
      * @param {Ext.ux.CheckColumn} this 
      * @param {Number} rowIndex The row index 
      * @param {Boolean} checked True if the box is checked 
      */ 
      'checkchange' 
     ); 

     me.callParent(arguments); 
    }, 

    updateColumnHeaderCheckbox: function(column){ 
     var image = column.getHeaderCheckboxImage(column.store, column.dataIndex); 
     column.setText(image); 
    }, 

    toggleSortState: function(){ 
     var me = this; 
     if(me.columnHeaderCheckbox) 
     { 
      var store = me.up('tablepanel').store; 
      var isAllChecked = me.getStoreIsAllChecked(store, me.dataIndex); 
      store.each(function(record){ 
       record.set(me.dataIndex, !isAllChecked); 
       record.commit(); 
      }); 
     } 
     else 
      me.callParent(arguments); 
    }, 

    getStoreIsAllChecked: function(store, dataIndex){ 
     var allTrue = true; 
     store.each(function(record){ 
      if(!record.get(dataIndex)) 
       allTrue = false; 
     }); 
     return allTrue; 
    }, 

    getHeaderCheckboxImage: function(store, dataIndex){ 

     var allTrue = this.getStoreIsAllChecked(store, dataIndex); 

     var cssPrefix = Ext.baseCSSPrefix, 
      cls = [cssPrefix + 'grid-checkheader']; 

     if (allTrue) { 
      cls.push(cssPrefix + 'grid-checkheader-checked'); 
     } 
     return '<div class="' + cls.join(' ') + '">&#160;</div>' 
    }, 

    /** 
    * @private 
    * Process and refire events routed from the GridView's processEvent method. 
    */ 
    processEvent: function(type, view, cell, recordIndex, cellIndex, e) { 
     if (type == 'mousedown' || (type == 'keydown' && (e.getKey() == e.ENTER || e.getKey() == e.SPACE))) { 
      var record = view.panel.store.getAt(recordIndex), 
       dataIndex = this.dataIndex, 
       checked = !record.get(dataIndex), 
       column = view.panel.columns[cellIndex]; 
      if(!(column.disableColumn || record.get(column.disabledColumnDataIndex) || (column.disableFunction && column.disableFunction(checked, record)))) 
      { 
       if(this.fireEvent('beforecheckchange', this, recordIndex, checked, record)) 
       { 
        record.set(dataIndex, checked); 
        this.fireEvent('checkchange', this, recordIndex, checked, record); 
       } 
      } 
      // cancel selection. 
      return false; 
     } else { 
      return this.callParent(arguments); 
     } 
    }, 

    // Note: class names are not placed on the prototype bc renderer scope 
    // is not in the header. 
    renderer : function(value, metaData, record, rowIndex, colIndex, store, view){ 
     var disabled = "", 
      column = view.panel.columns[colIndex]; 
     if(column.disableColumn || column.disabledColumnDataIndex || (column.disableFunction && column.disableFunction(value, record))) 
      disabled = "-disabled"; 
     var cssPrefix = Ext.baseCSSPrefix, 
      cls = [cssPrefix + 'grid-checkheader' + disabled]; 

     if (value) { 
      cls.push(cssPrefix + 'grid-checkheader-checked' + disabled); 
     } 
     return '<div class="' + cls.join(' ') + '">&#160;</div>'; 
    } 
}); 

a continuación, un ejemplo de configuración de una columna de casilla de verificación sería como este :

{ 
    xtype: "checkcolumn", 
    columnHeaderCheckbox: true,//this setting is necessary for what you want 
    store: (you need to put the grids store here), 
    sortable: false, 
    hideable: false, 
    menuDisabled: true, 
    dataIndex: "value_flag", 
    listeners: { 
     checkchange: function(column, rowIndex, checked){ 
      //code for whatever on checkchange here 
     } 
    } 
} 

se ve así: enter image description here

+0

Oh, asegúrese de volcar la edad de su checkcolumn incluye en la página :) – Reimius

+0

El único problema con esto es que 'checkchange' no se activa al hacer clic en la casilla de verificación del encabezado. ¿Hay una solución para eso? De lo contrario, esto es exactamente lo que necesitaba, ¡¡¡gracias !! – Jason

+1

Supongo que quiere que se active para todas las casillas de verificación que cambian cuando se cambia el estado del encabezado. Puedo actualizar mi versión de esto, si lo hago, le notificaré los cambios. Esto puede estar afectando negativamente a mi código en alguna parte. – Reimius

3

he creado un parche basado en el código proporcionado por @Reimius. Solo llama al método getStoreIsAllChecked cuando es necesario para mejorar el rendimiento un poco. También es compatible con Extjs 4.2 Espero que sea útil.

https://github.com/twinssbc/extjs-CheckColumnPatch

+0

¡Buen trabajo, amigo! Realmente, realmente me salvó, ¡muchas gracias! – Almas

+0

Tengo que usar el evento 'checkcolumn'. ¿Cómo hago aquí? – Arun

0

Utilizando el enfoque de bocong anterior no funcionó para mí fuera de la caja: la casilla de cabecera fue apareciendo sin control y no cambiará su estado de clic (también parecía un poco raro, se cortó solo un poco en el lado izquierdo).

he modificado (y simplificado en gran medida) el código de bocong arriba para conseguir que funcione bien para ExtJS 4.2.1 (copiar el marcado necesaria de casilla de una fila regular):

getHeaderCheckboxImage: function (allChecked) { 
    return '<img class="x4-grid-checkcolumn ' + (allChecked ? 'x4-grid-checkcolumn-checked' : '') + '">';  
} 

Parece que funciona ¡estupendo!

0

Debe usar la configuración si usa extjs 6.5.2 o superior.

{ 
    xtype: 'checkcolumn', 
    headerCheckbox: true, // THIS OPETION SHOW YOU CHECKBOX ON HEADER. 
    sortable: false, // THIS OPTION DISABLE SORTING. 
    hideable: false, // THIS OPTION EXCLUDE COLUMN FORM MENU. 
    menuDisabled: true, //THIS OPTION HIDE MENU ON THE HEADER. 
    dataIndex: 'isChecked', 
    width: 25 
} 

La salida será así. Output will be like this

Me gusta si te gusta esta sugerencia.

Cuestiones relacionadas