2013-08-18 75 views
1

首先,我首先創建自定義比較器的原因是因爲表達式上的屬性(如'tags')需要表達式具有特定順序的值並且不會以其他方式匹配。 (因此,帶有標籤['a','b']的表達式將匹配['x','a','b','y']而不是['x','b','a',' y']。)

我已經能夠解決這個問題了,因爲在Angular的$ filter過程中,它允許你提供一個自定義比較器。但是,我只能根據屬性類型進行過濾,而不是密鑰的值。

我想要一個自定義的比較器只有一個對象的屬性。有沒有辦法做到這一點,而不需要複製和修改Angular的源代碼?

這裏是我的自定義比較的例子:(在http://plnkr.co/edit/eFeinQhHTIZrzXBm4srq找到)

$scope.inclusiveFilter = function(expected, actual){ 
    if(expected && actual){ 
     console.log(expected, actual); 
     if(angular.isArray(expected) && angular.isArray(actual)){ 
      for(var t in actual){ 
       if(expected.indexOf(actual[t]) == -1){ 
        return false; 
       } 
      } 
     } 

     return true; 
    } 
    } 

在我的例子上的標籤過濾器工作得很好,但它不再適用於$匹配任何財產,我我只能根據他們的類型比較屬性,而不是他們的名字。所以像這樣的表達可能永遠不會工作:

{ 
    includeThese: ['a', 'b'], 
    excludeThese: ['x', 'y'] 
} 
+0

我不知道這是否會幫助你,但你可以使用一個鍵值對,在表達NG重複(鍵,值) - 其中鍵和值可以是任何用戶定義的標識符,和表達式是給出集合枚舉的範圍表達式。 例如:({adam':10,'amalie':12}中的(姓名,年齡)。 – Brett

回答

4

我不完全確定我明白你在問什麼。我用2個自定義過濾器函數爲你製作了一個plunkr,一個在列表項中按順序查找「a」和「b」,另一個查找「a」和「b」項目。希望你能接受並修改它來做你想做的事。我認爲,爲了您的目的,自定義過濾器函數比自定義比較器更容易處理。

http://plnkr.co/edit/fJ9iPQYyhGxAt00xi0OY

+0

本例中的比較器'inclusiveComparator'是已定義但從未使用的。有沒有比較器被使用的例子? Doc在這裏很困惑。 –