2012-08-17 63 views

回答

19

是的,这是可能的。使用dgrid/OnDemandGrid并定义query函数将返回truefalse根据您的逻辑为dojo/store为电网供电的每行。

我准备的例子在的jsfiddle与玩:http://jsfiddle.net/phusick/7gnFd/,所以我不必解释太多:

enter image description here

查询功能:

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; 
}; 

网格:

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

感谢phusick!很有帮助! 你可以解释一下这行: if(〜name.indexOf(filterString.toLowerCase())){return true;} – teaman 2012-09-04 18:02:39

+0

也好奇你为什么在filterString的末尾附加“”。是将它转换为字符串吗? – teaman 2012-09-04 21:37:45

+2

是的,根据我需要'长度'和'toLowerCase()'使它成为一个字符串。 _tilde_或bitewise NOT运算符比'name.indexOf(filterString.toLowerCase())> -1'更短,在某些浏览器中[更快](http://jsperf.com/indexof-and-tilde/2)。参见[Tilde的大奥秘(〜)](http://www.joezimjs.com/javascript/great-mystery-of-the-tilde/)。 – phusick 2012-09-05 17:55:35

0

我知道这不是所问问题的答案,所提供的答案是高超的,我们使用它很多。

但是,如果您使用TreeGrid(具有“dgrid/tree”插件的列),则此功能似乎不起作用。我已经编写了一些代码来模拟与树网格接受的答案相同的行为。它基本上只是循环访问商店中的商品,并隐藏任何不符合您提出的条件的行元素。以为我会分享它,以防它有助于任何人。这是相当丑陋的,我相信它可以改进,但它的作品。

它基本上使用与phusick的答案相同的概念。您需要观看一个文本框的值,但不是刷新你的网格它调用一个函数:

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)); 
        })); 

而这里的功能:

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); 
       } 
      } 
相关问题