2015-11-02 55 views
0

JSBin:http://live.datatables.net/nujehixu/3/edit?js,console,outputjQuery的數據表 - 自定義篩選基於原始行數據

$(document).ready(function() { 

    // push our custom filter onto the stack of filters 
    $.fn.dataTable.ext.search.push(function(settings, searchData, index, rowData, counter) { 
    // get filter value 
    var value = $("#example_filter > label > input").val().toLowerCase(); 
    // check filter value against original row data 
    var original = rowData[1].toLowerCase(); 
    console.log(original); 
    return original.indexOf(value) > -1; 
    }); 

    function addEllipsis(original, charLimit) { 
    if (original.length > charLimit) { 
     // substring the original and add ellipsis with a title attribute of the original 
     return '<div title="' + original + '">' + original.substr(0, charLimit) + '&hellip;' + '</div>'; 
    } 
    // return the original value since it is already short enough 
    return '<div title="' + original + '">' + original + '</div>'; 
    } 

    var table = $('#example').DataTable({ 
    columnDefs: [ 
     { 
     targets: 1, 
     render: function (data, type, row) { 
      // render with ellipsis if necessary 
      return addEllipsis(data, 6); 
     } 
     } 
    ] 
    }); 
}); 

退房鏈接的例子,我試圖使用基於原始行數據的自定義過濾器,但問題的表面時,輸入一個過濾器值,如systems。當我期望systems匹配「系統管理員」並顯示這些行時,系統管理員的行將被過濾掉。

通過source閱讀,它看起來像有第一貼靠搜索字符串,這是一個compiled from the rendered valuesglobal filter

有沒有人找到解決方案?

+0

你的意思是錯誤的過濾掉? –

+0

@OlaviSau,我的意思是我希望系統與系統管理員匹配並顯示該行,但情況並非如此。我會編輯以更清楚地說明。 –

+0

@JayTaggart - 已將代碼編輯到問題中。你應該真的在問題中包含一些代碼,特別是當問題是關於某些特定的代碼無法工作時。鏈接無法幫助未來的訪問者認識到問題,並且沒有人能確定您的鏈接將在3天,3個月或3年內持續或失效。 – davidkonrad

回答

1

你的問題是仍然執行默認搜索,並且由於列的值呈現爲「system ...」,所以它無法找到與「系統」匹配的任何匹配項。你可以這樣說:

$("#example_filter > label > input").unbind().bind('keyup', function() { 
    var value = this.value.toLowerCase(); 
    // push our custom filter onto the stack of filters 
    $.fn.dataTable.ext.search.push(function(settings, searchData, index, rowData, counter) { 
    // get filter value 
    // check filter value against original row data 
    var original = rowData[1].toLowerCase(); 
    console.log(original); 
    return original.indexOf(value) > -1; 
    }); 
    table.draw(); 
    $.fn.dataTable.ext.search.pop(); 
}) 

改變代碼 - >http://live.datatables.net/dalesexe/4/edit


一個更好的答案是基於type,可以是_filterdisplayrender()返回不同的值。在display返回橢圓的'值,否則返回原始值。由你可以跳過完全自定義過濾器:

render: function (data, type, row) { 
      switch (type) { 
       case 'display' : 
       return addEllipsis(data, 6); break; 
       default : 
       return data; break; 
      }    
     } 

新代碼 - >http://live.datatables.net/dalesexe/6/edit

+0

與此相關的問題是除了您編碼的特定情況之外,您將失去所有過濾。例如,如果要搜索特定的名稱,則必須在某些邏輯中編寫代碼來檢查rowData [0]。理想情況下,我想保持默認行爲,並用我的邏輯加強它。 –

+0

我會盡力解決眼前的問題,但我仍然想看看是否有更好的答案。如果24小時內我沒有更好的結果,我會將其標記爲答案。 –

+0

@JayTaggart - 看到更新,有一個更好的答案,或者至少有更好的解決方案 - 我只是專注於讓您的自定義過濾器工作。 – davidkonrad

0

問題是,您的charlimit剪切字符和您的匹配與顯示的數據而不是原始數據。基本上systems無法找到,因爲system是最大長度。

+0

如果你看看我的功能,我看看原始數據,它是系統管理員。我已經更新,包括一個console.log –

+0

我試圖給子字符串添加+1,它的工作如下:O –

+0

rowdata從哪裏來? –