2016-12-05 68 views
1

我過濾的對象使用NG重複AngularJS列表:使用感嘆號與AngularJS第一個字符過濾

<tr ng-repeat="application in page.applications | filter: {DisplayName:page.ApplicationSearchValue}"> 
    {{application.DisplayName}} 
</tr> 

如果用戶將一個感嘆號作爲在搜索框中輸入的第一個字符,那麼Angular將它解釋爲否定符號。所以!MyApplication返回除MyAppliction之外的所有應用程序。

我嘗試使用自定義函數作爲the Angular documentation for filter中的說明,但感嘆號從未找到進入該函數的方法。

我發現代碼通過下面的函數會在AngularJS source code,這基本上是強制感嘆號得到特殊待遇:

function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) { 
    var actualType = getTypeForFilter(actual); 
    var expectedType = getTypeForFilter(expected); 

    if ((expectedType === 'string') && (expected.charAt(0) === '!')) { 
    return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp); 

     ..... 

我目前的「解決方案」是過濾器對象更改爲:

filter: {DisplayName:(page.ApplicationSearchValue.indexOf('!') == 0 ? page.ApplicationSearchValue.substring(1) : page.ApplicationSearchValue)} 

但直到QA計算出,如果有人用!!開始搜索框將仍然出現問題,這只是一個時間問題。

處理這種情況是否有共同的模式?

+0

向我們展示如何使用自定義函數進行嘗試。 –

+0

'ctrl.filterFunc = function(actual,expected){ expected = expected.indexOf('!')== 0? expected.substring(1):預期; return actual.toLowerCase()。indexOf(expected)!= -1; }' 但是預期的價值從未包含感嘆號。 – HaveSpacesuit

+0

不要通過比較器。傳遞一個函數作爲過濾器的唯一參數。如果該元素應該被過濾器接受,則使該函數返回true;否則返回false。 –

回答

1

我結束了使用我從這篇文章修改的指令。 https://stackoverflow.com/a/15346236/2908576

MyApp.directive("noNegation", [function() { 
    return { 
     require: "ngModel", 
     link: function(scope, element, attrs, ngModelController) { 
      ngModelController.$parsers.push(function(data) { 
       while (data.indexOf("!") == 0) 
        data = data.substring(1); 
       return data; 
      }); 
     } 
    }; 
}]); 

它忽略了所有的驚歎號在輸入的開始。這意味着搜索!!!MyApplication仍會返回MyApplication,即使感嘆號不在名稱中。