2014-06-18 76 views
1

我正在使用Ng表格顯示3列的項目列表:Name,Rack,Group。ng表格不會嚴格比較過濾空字符串

我想申請「嚴格比較」那些列,所以我所做的就是:

self.tableParams = new ngTableParams({ 
    page: 1, 
    // This count: 2 can be ignored as we change it in every request. 
    count: 50, 
    }, { 
    counts: [], 
    total: 100, 
    getData: function ($defer, params) { 

     var filteredData = params.filter() ? $filter('filter')(self.data, params.filter(), true) : self.data; 
     var orderedData = params.sorting() ? $filter('orderBy')(filteredData, params.orderBy()) : self.data; 

     $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count())); 
    } 
    }); 

你可以假設self.data包含我的所有數據,並在我的控制器var self = this;

與上述代碼的問題是,當您刪除其中一列中的過濾器字符串時,$filter('filter')(self.data, params.filter(), true)不會返回任何結果。

我發現,當你擦除列(可以說名稱列),params.filter()將包含類似這樣的對象:{「名」:「」},它會傳送到$filter('filter')和過濾器試圖匹配只有空字符串!

我試圖通過添加以下代碼重寫此:

getData: function ($defer, params) { 
     // When the user deletes the search text, this object keeps a variable with an empty string. The 
     // strict comparator will accept only empty strings. To overcome this problem we delete the property 
     for (var propt in params.filter()) { 
     if (params.filter()[propt] === '') { 
      delete params.filter()[propt]; 
     } 
     } 

     var filteredData = params.filter() ? $filter('filter')(self.data, params.filter()) : self.data; 
     var orderedData = params.sorting() ? $filter('orderBy')(filteredData, params.orderBy()) : self.data; 

     $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count())); 
    } 

我的問題是,是不是優雅的解決方案,而這些代碼是循環對所有的搜索欄,看看其中之一是一個空的字符串。我能更快做點什麼嗎?那可以準確找到哪一列是空的並刪除該屬性?更多的東西優雅和更少hacky?

回答

1

我對你的解決方案有一點修正,因爲在使用你的代碼的情況下,輸入參數後進行過濾,擦除,輸入不起作用。爲了獲得過濾數據,用戶必須再次輸入參數。這就是爲什麼我將params.filter()複製到另一個變量並加以處理。

getData: function ($defer, params) { 

    var customFilter = angular.copy(params.filter()); 

    for (var propt in customFilter) { 
    if (customFilter[propt] === '') { 
     delete customFilter[propt]; 
     } 
    } 
orderedData = customFilter ? $filter('filter')(orderedData, customFilter, true) : orderedData; 
0

請注意,這個問題已經被通過包括 '裝飾' 參數params.filter()解決:

getData: function(params) { 
    var myData = /* ... */ 
    var filteredData = (params.filter(true) ? 
    $filter('filter')(myData, params.filter(true) : 
    myData); 
    return filteredData; 
} 

ngTable API documentation

裝飾:布爾

[可選]提供true返回當前過濾器減去任何不重要的值(空,未定義和空字符串)