2014-01-10 41 views
1

我需要一些幫助,AngularJS的過濾器..(Angularjs 1.2.7)AngularJS篩選對象的單一屬性沒有NG-重複

這是我的問題:

我有一類用戶是這樣的。

Public Class User 
    Public Property UserID As Integer 
    Public Property EMail As String 
    Public Property Password As String 
    Public Property Firstname As String 
    Public Property Lastname As String 
    Public Property Creator As Integer 
    Public Property LastEditedBy As Integer 
    Public Property Company As Company 
End Class 

和公司類是這樣的:

Public Class Company 
    Public Property CompanyID As Integer 
    Public Property Name As String 
    Public Property RegistrationDate As String 
    Public Property Creator As Integer 
    Public Property LastEditDate As String 
    Public Property LastEditedBy As Integer 
    <ScriptIgnore> 
    Public Property Users As List(Of User) 
    Public Property Companytype As Companytype 
    <ScriptIgnore> 
    Public Property PriceLists As List(Of CompanyPriceList) 
End Class 

好了,現在在我的公司或用戶類別集中在2房產(Creator和LastEditedBy)。 我想在公司的視圖中獲取公司創建者和編輯者的名和姓。

有了這個:

companyManagement.getCompany = function (companyId) { 
    var cmp = $filter('getCmpById')(companyId); 
    return cmp; 
}; 

我整個公司與這兩個整數獲得作爲一個對象.. 現在在我的GUI我想表明屬於該ID的用戶的第一代和姓氏。

app.filter('getUsrById', function (userManagement) { 
var users = userManagement.getUsers(); 
return function (list) { 
    var i = 0, len = users.length; 
    for (; i < len; i++) { 
     //convert both ids to numbers to be sure 
     if (+users[i].UserID == +list) { 
      return users[i]; 
     } 
    } 
    return "not found"; 
}; 

});

使用此篩選器,我得到屬於該id的整個用戶對象。 現在有什麼辦法,我可以只顯示用戶的這兩個屬性? 這樣的事......

<span data-ng-model="creatorFirstname">{{ user.firstname | getUsrById:{userId:singleCompany.Creator} }}</span> 
<span data-ng-model="creatorLastname">{{ user.lastname | getUsrById:{userId:singleCompany.Creator} }}</span> 
<span data-ng-model="editorFirstname">{{ user.firstname | getUsrById:{userId:singleCompany.LastEditedBy} }}</span> 
<span data-ng-model="editorLastname">{{ user.lastname | getUsrById:{userId:singleCompany.LastEditedBy} }}</span> 

我不想申報屬性作爲用戶,因爲我有他們在這兩個類,我想有點一致的。 不在用戶 - >作爲整數 而在公司 - >作爲用戶 因此,我可以忽略它們並將舊數據發送回服務器,因爲LastEditedBy屬性總是被覆蓋並且創建者屬性始終保持不變。

感謝您的幫助!

+1

我相信你的問題很容易解決 - 但你的例子描述非常複雜。似乎有很多代碼是無法看到的。請嘗試創建一個plunkr或小提琴。它會幫助我們幫助你。 – michael

+0

這沒有任何意義。如果它是單個值,那麼過濾是什麼? – Dalorzo

+0

嗨邁克爾,我想你只需要專注於最後一部分。我有一個公司,我想顯示一個用戶的名字和姓氏,這些屬性在用戶對象中,我用上面的過濾器(通過ID)過濾。 我想以類似的方式在我的GUI中使用過濾器,就像我上面的代碼一樣。 這{{user ... | filter}}是對象,從這我只想顯示兩個屬性。 – Anthrax

回答

3

不確定篩選器是否是正確的機制來執行您想要的操作。我認爲最自然的方式來編碼這將是有一個公司,lastEditedBy創建者屬性在您的範圍,並計算出哪些用戶是你的興趣,並將它們添加到您的公司模型。

當你的公司被檢索添加幾行到您的成功處理程序(這裏使用underscore js,以獲取用戶

$scope.lastEditedBy = _.findWhere($company.users, { UserID : $company.LastEditedBy }); 
$scope.creator = _.findWhere($company.users, { UserID : $company.Creator }); 

然後你只需要引用你需要的任何財產lastEditedBy創造者

<span>{{lastEditedBy.firstname}}</span> 
<span>{{lastEditedBy.lastname}}</span> 
<span>{{creator.firstname}}</span> 
<span>{{creator.lastname}}</span> 
1

你實際上可以用$ filter做到這一點,你只需返回單個值,並像這樣獲取子零點...而事實上,你可以使自己的findWhere過濾器:

lrApp.filter('findWhere',function($filter){ 
    return function(collection,search) { 
     var refined = $filter('filter')(collection,search); 
     return refined[0]; 
    } 
}); 

$filter('findWhere')($scope.users,{ UserID : $company.LastEditedBy }); 

,甚至更好,但和我測試過這一點,它的工作原理

angular.findWhere = function(collection,search) { 
    var $filter = angular.element(document).injector().get("$filter"), 
     refined = $filter('filter')(collection,search); 
    return refined[0]; 
} 

顯然你需要替換「angular.element(文檔)「與你的應用程序啓動的任何節點,我這樣做是因爲我把這個函數放在運行函數之外,但是如果它在運行函數內部,你只需要注入$注入器服務,然後改變」 「angular.element(document).injector()」改爲「$ injector.get(」$ filter「)」,甚至只是將$ filter過濾到run函數。

0

我知道這個問題太老了,但可能會幫助其他人。

<span ng-bind="(users | filter : {UserID : singleCompany.Creator } : true)[0].firstname"></span> 
<span ng-bind="(users | filter : {UserID : singleCompany.Creator } : true)[0].lastname"></span> 
<span ng-bind="(users | filter : {UserID : singleCompany.LastEditedBy } : true)[0].firstname"></span> 
<span ng-bind="(users | filter : {UserID : singleCompany.LastEditedBy } : true)[0].lastname"></span>