2015-04-01 77 views
3

我在整理其包含純文本和HTML像一個錨標記的列的問題,同一列純文本和HTML排序問題。排序似乎發生在存儲在數據源數組中的值上,而不是顯示的值上。包含錨標籤的單元總是在純文本單元格上方排序。在使用Handsontable

下面是一個例子的的jsfiddle。我希望第三列按字母順序排列名稱,而不管該單元格是否包含錨標記或純文本。

例子: http://jsfiddle.net/5sL2jkqt/

{ data: 2, renderer: "html" } 

我試圖在第三列應用自定義單元格渲染器,但沒有幫助。任何建議如何解決這個問題將不勝感激!

回答

0

不幸的是,排序插件將始終排序的價值,而不是真實顯示的內容。但是,您可以實施自己的分類。在這種情況下,這是你最好的選擇。

你會做什麼是禁止在炎熱的排序,然後在標題的點擊,就像HOT排序,觸發排序功能。

這一個應該採取行動的data對象本身。確保檢查哪個頭被點擊,以便您可以將其翻譯成索引。其餘的應該是直截了當:

使用類似data.sort(function(item1, item2) { //logic }),你現在可以排序數據陣列根據您想要的任何特徵。看起來最簡單的方法是根據列索引1值進行排序,因此您可以這樣做:

// item1 is a row and item2 is the row right after it 
data.sort(function(item1, item2) { 
    return item1[1] > item2[1] ? 1 : -1; // returning 1 makes item1 greater 
} 
hotInstance.render(); // remember to re-render when done 

這將是最簡單的方法。它也給你更多的靈活性。祝你好運。

1

我做什麼來解決這個問題是下面的函數添加到handsontable.full.js

// Strip out all tags not in the allowed parameter 
    function stripTags(input, allowed) { 

     if (!input) { 
      return ""; 
     } else if (!isNaN(input)) { 
      return input; 
     } 

     // making sure the allowed arg is a string containing only tags in lowercase (<a><c>) 
     allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(""); 


     var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi, 
      commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi; 


     return input.replace(commentsAndPhpTags, "").replace(tags, function ($0, $1) { 

      return allowed.indexOf("<" + $1.toLowerCase() + ">") > -1 ? $0 : ""; 

     }); 


    }; 

我當時稱爲在本地handsontable功能this.sort的stripTags功能,增加了你正在排序的數組this.sortIndex如下:

this.sortIndex.push([i, stripTags(instance.getDataAtCell(i, this.sortColumn + colOffset), "")]); 

不是100%的理想,但工作像一個魅力。它去掉HTML並對剩餘的內容進行排序。

也可以在GitHub上找到