2016-04-30 65 views
0

串我有一個對象與對象數組內這樣的:如何檢查是否對象的子陣列包含角度濾波器

Companies = 
{ 
    "-KGZPUea1ZtWVXspLRGF" : { 
    "assignedUsers" : [ { 
     "email" : "[email protected]" 
    } ], 
    "name" : "Talon" 
    }, 
    "-KGcS8doqRw1Jcemhxuz" : { 
    "assignedUsers" : [ { 
     "email" : "[email protected]", 
     "status" : "active" 
    } ], 
    "name" : "Billy" 
    } 
} 

我wan't能夠創建的角濾波器,其只篩選出分配了特定電子郵件且其狀態處於活動狀態的公司。

像這樣的事情

<div ng-repeat="company in Companies | filter:{assignedUsers contains '[email protected]' && assignedUsers.status == 'active'}"> 

是類似的東西可能嗎?

+0

是的,這是可能的,因爲過濾器可以自定義謂詞函數作爲參數,並斷言功能,可以爲所欲爲。 https://docs.angularjs.org/api/ng/filter/filter –

回答

1

是的,這是可行的。不,這不可能純粹以你的觀點來完成。

受益於過濾器可以採取功能進行評估的事實,您可以將此邏輯寫入控制器。

scope.testCompany = function(company) { 
    if (!company || !company.assignedUsers) return false; 

    for (var i = 0; i < company.assignedUsers.length; i++) { 
     var e = company.assignedUsers[i]; 

     if (e.email === '[email protected]' && e.status === 'active') { 
      return true; 
     } 
    } 

    return false; 
}; 

然後你可以使用它。

<div ng-repeat="company in Companies | filter:testCompany"> 

如果要動態設置電子郵件地址,您有兩個選項。一種方法是設置一個新的過濾器(如angular.module(...).filter(...)),或者你可以從上面設置你的函數來接受一個參數。過濾器選項可能在哲學上稍微好一點,但可以工作。

scope.testCompanyForEmail = function(emailAddress) { 
    return function(company) { 
     if (!company || !company.assignedUsers) return false; 

     for (var i = 0; i < company.assignedUsers.length; i++) { 
      var e = company.assignedUsers[i]; 

      if (e.email === emailAddress && e.status === 'active') { 
       return true; 
      } 
     } 

     return false; 
    } 
}; 

用作:

<div ng-repeat="company in Companies | filter:testCompanyForEmail('[email protected]')"> 
+0

我將如何傳遞一個動態電子郵件作爲參數,在過濾器中你沒有任何參數被傳遞? – Jordash

+1

@Jordash看到更新 –

+0

好吧,工作,我遇到了另一個問題,我需要傳遞公司對象作爲參數(我可以傳遞其他參數到函數中,但是當我嘗試並通過公司時,它進入未定義') – Jordash