我需要一些AngularJS过滤器帮助..(Angularjs 1.2.7)
这是我的问题:
我有一个像这样的用户类。
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 Property(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>
我不想声明属性为用户,因为我在两个类中都有它们,我想要一点点的一致性。 不在用户中 - &gt;作为整数 在公司 - &gt;作为用户 所以我可以忽略它们并将旧数据发送回服务器,因为LastEditedBy属性总是被它覆盖,而Creator属性总是保持不变。
感谢您的帮助!
答案 0 :(得分: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 :(得分: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];
}
显然你需要更换&#34; angular.element(document)&#34;随着你的应用程序启动的任何节点,我已经这样做了,因为我把这个功能放在了run函数之外但是如果它在run函数里面你只需要注入$ injector服务然后改变&# 34; angular.element(文件).injector()&#34; to&#34; $ injector.get(&#34; $ filter&#34;)&#34;甚至只是将$ filter注入run函数。
答案 2 :(得分: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>