Angular orderBy过滤器和只有方法的对象数组

时间:2014-11-27 00:26:28

标签: javascript angularjs angularjs-scope angularjs-ng-repeat

我有一个对象数组。这些对象唯一暴露的接口是它们的方法。

obj = { 
  getId : function() { ... },
  getName : function() { ... },
  getAvgHours : function() { ... }
}

实际上,有些字段包含实际值。但这些是生成的代码,所以这些字段以密码命名,被埋在另一层字段下。只能通过提供的函数来访问它们的值。

我正在寻找类似下面的内容,但它不起作用:

<tr ng-repeat="p in people | orderBy:p.getAvgHours()">

我可以在作用域中添加一个名为function getAvgHours(p) { return p.getAvgHours(); }的作用域。但这似乎是多余的,我需要添加十几个这样的功能。

还有更好的方法吗?

2 个答案:

答案 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]();
    };
};

在从谓词返回的函数内部,您将可以访问正在排序的对象,因此您可以在那里调用该方法并获取值。

DEMO