2012-08-17 19 views

risposta

19

Sì, è possibile. Utilizzare dgrid/OnDemandGrid e definire la funzione query che restituirà true o false in base alla logica per ogni riga in dojo/store che alimenta la griglia.

ho preparato un esempio per giocare con a jsFiddle: http://jsfiddle.net/phusick/7gnFd/, quindi non c'è bisogno di spiegare troppo:

enter image description here

la funzione di query:

var filterQuery = function(item, index, items) { 
    var filterString = filter ? filter.get("value") + "" : ""; 

    // early exists 
    if (filterString.length < 2) return true; 
    if (!item.Name) return false; 

    // compare 
    var name = (item.Name + "").toLowerCase(); 
    if (~name.indexOf(filterString.toLowerCase())) { return true;} 

    return false; 
}; 

The Grid :

var grid = new Grid({ 
    store: store, 
    query: filterQuery, // <== the query function for filtering 
    columns: { 
     Name: "Name", 
     Year: "Year", 
     Artist: "Artist", 
     Album: "Album", 
     Genre: "Genre" 
    } 
}, "grid"); 
+0

Grazie phusick! Molto utile! Puoi spiegare la riga: if (~ nome.indexOf (filterString.toLowerCase())) {return true;} – teaman

+0

Anche curioso di sapere perché si aggiunge "" alla fine di filterString. È quello di convertirlo in una stringa? – teaman

+2

Sì, per renderlo una stringa in quanto avevo bisogno di 'length' e' toLowerCase() '. L'operatore _tilde_ o bitewise NOT è più corto e in alcuni browser [più veloce] (http://jsperf.com/indexof-and-tilde/2) rispetto a 'name.indexOf (filterString.toLowerCase())> -1'. Vedi [The Great Mystery of the Tilde (~)] (http://www.joezimjs.com/javascript/great-mystery-of-the-tilde/). – phusick

0

So che questa non è la risposta alla domanda posta e la risposta fornita è magistrale e la usiamo abbastanza.

Tuttavia, questa funzionalità non sembra funzionare bene se si utilizza una TreeGrid (colonne con il plugin "dgrid/tree"). Ho scritto del codice per simulare lo stesso comportamento della risposta accettata con una griglia ad albero. Fondamentalmente si tratta solo di scorrere gli articoli nel negozio e nascondere tutti gli elementi di riga che non corrispondono a nessuna condizione stabilita. Ho pensato di condividerlo nel caso in cui aiuti qualcuno. È piuttosto brutto e sono sicuro che può essere migliorato, ma funziona.

In pratica utilizza lo stesso concetto della risposta di phusick. Hai bisogno di guardare un valore su un TextBox, ma invece di aggiornare la griglia di gioco è fatto chiamare una funzione:

textBox.watch("value", lang.hitch(this, function() { 
         if (timeoutId) { 
          clearTimeout(timeoutId); 
          timeoutId = null; 
         }; 

         timeoutId = setTimeout(lang.hitch(this, function() { 
          this.filterGridByName(textBox.get('value'), myGrid); 
         }, 300)); 
        })); 

Ed ecco la funzione:

filterGridByName: function(name, grid){ 
       try { 
         for (var j in grid.store.data){ 
          var dataItem = grid.store.data[j]; 
          var childrenLength = dataItem.children.length; 
          var childrenHiddenCount = 0; 
          var parentRow = grid.row(dataItem.id); 
          for (var k in dataItem.children){ 

           var row = grid.row(dataItem.children[k].id); 
           var found = false; 
           if (dataItem.children[k].name.toLowerCase().indexOf(name.toLowerCase()) != -1){ 
            found = true; 
           } 
           if (found){ 
            if (row.element){ 
             domStyle.set(row.element, "display", "block"); 
            } 
            if (parentRow.element){ 
             domStyle.set(parentRow.element, "display", "block"); 
            } 
           } else { 
            childrenHiddenCount++; 
            // programmatically uncheck any hidden item so hidden items 
            for (var m in grid.dirty){ 
             if (m === dataItem.children[k].id && grid.dirty[m].selected){ 
              grid.dirty[m].selected = false; 
             } 
            } 
            if (row.element){ 
             domStyle.set(row.element, "display", "none"); 
            } 
           } 
          } 
          // if all of the children were hidden, hide the parent too 

          if (childrenLength === childrenHiddenCount){ 
           domStyle.set(parentRow.element, "display", "none"); 
          } 
         } 
       } catch (err){ 
        console.info("error: ", err); 
       } 
      } 
Problemi correlati