2013-08-09 7 views
5

Muszę usunąć możliwość zaznaczania niektórych wierszy w mojej siatce.Usuwanie możliwości wybierania określonych wierszy w siatce ExtJS 4

używam CheckboxModel

selModel: Ext.create('Ext.selection.CheckboxModel', { 
    mode: 'SIMPLE' 
}) 

Aby wyłączyć wybór używam beforeselect wydarzenie

beforeselect: function (row, model, index) { 
    if (model.data.id == '3') { 
     return false; 
    } 
} 

oraz ukrycie wyboru Używam specyficzną klasę dla wiersza i reguły CSS

viewConfig: { 
    getRowClass: function(record, index) { 
     var id = record.get('id'); 
     return id == '3' ? 'general-rule' : ''; 
    } 
} 

.general-rule .x-grid-row-checker { 
    left: -9999px !important; 
    position: relative; 
} 

Może to nie jest najlepszym sposobem osiągnięcia pożądanego rezultatu, ale dla mojego zadania działa.

Pojawia się jednak inny problem: Zaznacz wszystko/Anuluj zaznaczenie Wszystkie pole wyboru w nagłówku siatki przestanie działać. Po pierwszym kliknięciu tego pola wyboru wszystkie linie oprócz tych, które nie powinny być wybrane, zostaną wybrane, ale jeśli klikniesz ponownie, nic się nie stanie. Oczywiście system próbuje ponownie wybrać wszystkie wiersze, ponieważ są one niezaznaczone.

Czy istnieje lepszy sposób rozwiązania problemu? Lub jak rozwiązać problem za pomocą tej metody.

Jedyna rzecz, która przychodzi na myśl - trzeba przepisać funkcje Zaznacz wszystko/Anuluj zaznaczenie wszystkich dla pola wyboru, ale nie jestem pewien, jak mogę to zrobić.

Z góry dziękuję za odpowiedzi i przepraszam, jeśli postawiłem moje pytanie nie zgodnie z zasadami.

Odpowiedz

2

Ostateczne rozwiązanie mojego zadania (usunąć możliwość wyboru konkretnego wiersza przez jego id) jest następujący:

Zastąp selectAll (i unselectAll jeśli to konieczne) metoda podczas definiowania modelu selekcji do ignorować spicified wiersze:

selModel: Ext.create('Ext.selection.CheckboxModel', { 
    mode: 'SIMPLE', 
    select: function(records, keepExisting, suppressEvent) { 
     if (Ext.isDefined(records)) { 
      this.doSelect(records, keepExisting, suppressEvent); 
     } 
    }, 
    selectAll: function(suppressEvent) { 
     var me = this, 
      selections = me.store.getRange(); 

     for(var key in selections) { 
      if(selections[key].data.id == '3') { 
       selections.splice(key, 1); 
       break; 
      } 
     } 

     var i = 0, 
      len = selections.length, 
      selLen = me.getSelection().length; 

     if(len != selLen) { 
      me.bulkChange = true; 
      for (; i < len; i++) { 
       me.doSelect(selections[i], true, suppressEvent); 
      } 
      delete me.bulkChange; 

      me.maybeFireSelectionChange(me.getSelection().length !== selLen); 
     } 
     else { 
      me.deselectAll(suppressEvent); 
     } 
    } 
}) 

Korzystając beforeselect przypadku wyłączenia wybór dla określonych wierszy:

beforeselect: function (row, model, index) { 
    if (model.data.id == '3') { 
     return false; 
    } 
} 

Zastosowanie specjalnej klasy dla określonych wierszy i odpowiednia reguła css ukrywać określone wiersze:

viewConfig: { 
    getRowClass: function(record, index) { 
     var id = record.get('id'); 
     return id == '3' ? 'general-rule' : ''; 
    } 
} 

.general-rule .x-grid-row-checker { 
    left: -9999px !important; 
    position: relative; 
} 

Thanks Evan Trimboli o poradę!

1

Obecnie nie ma wbudowanych haków, które umożliwiałyby taką funkcjonalność. Pole wyboru nagłówka wywołuje selectAll i deselectAll, więc konieczne będzie zastąpienie tych metod, aby zapobiec ich na podstawie jednego rekordu.

Powiązane problemy