我有一个对象数组。这些对象唯一暴露的接口是它们的方法。
obj = {
getId : function() { ... },
getName : function() { ... },
getAvgHours : function() { ... }
}
实际上,有些字段包含实际值。但这些是生成的代码,所以这些字段以密码命名,被埋在另一层字段下。只能通过提供的函数来访问它们的值。
我正在寻找类似下面的内容,但它不起作用:
<tr ng-repeat="p in people | orderBy:p.getAvgHours()">
我可以在作用域中添加一个名为function getAvgHours(p) { return p.getAvgHours(); }
的作用域。但这似乎是多余的,我需要添加十几个这样的功能。
还有更好的方法吗?
答案 0 :(得分:1)
可能有更好的方法,但一种解决方案是编写自己的包装正常orderBy
的过滤器。这是一个例子:
myApp.filter("orderByObjFunc", ["$filter", function($filter) {
return function(input, funcName, reverse) {
input = input.map(function(a) { a.zSortField = a[funcName](); return a; });
return $filter('orderBy')(input, 'zSortField', reverse);
};
}]);
这将使您免于制作十几个辅助函数。你可以这样使用它:
<tr ng-repeat="p in people | orderByObjFunc:'getAvgHours'">
此处 a working fiddle。
答案 1 :(得分:1)
您可以简单地使用谓词并将您希望调用的方法作为字符串传递。
标记:
orderBy:fnValue('getId')
谓词函数:
$scope.fnValue = function (fn) {
return function (obj) {
return obj[fn]();
};
};
在从谓词返回的函数内部,您将可以访问正在排序的对象,因此您可以在那里调用该方法并获取值。