【发布时间】:2013-12-13 11:55:31
【问题描述】:
我正在尝试对过滤器中的对象应用转换,这会导致返回一组新对象。这是因为我想在应用转换后过滤对象并显示转换结果。然而,我最终得到了一个无限的摘要,因为我显示的对象与我放入的对象不同(比较它们的 $$ids 时)。我解决这个问题的想法如下:
使用
track by item.id之类的跟踪表达式,并将原始对象的ids分配给每个转换后的对象。虽然目前我所有的对象都有id,但这似乎是个坏主意,因为它使过滤器的通用性大大降低——原始对象必须有id,转换不能设置id(因为它会被覆盖)等。将原始对象的
$$id分配给转换后的对象。这似乎很骇人听闻,根据我的理解,$$id应该是只读的。根据转换过滤的结果返回原始对象的子集。这可能会导致性能问题,因为需要在过滤器和显示表达式中应用转换,并且我必须循环返回已转换/过滤的项目以选择要返回的正确原始项目。
这是过滤器:
listModule.filter('ui.filter.transformFilter',
['$filter',
'$id',
function($filter, $id)
{
var Filter = $filter('filter');
return function(objects, transformer, expression) {
// precondition- we need a list of objects
if (!_.isArray(objects)) {
return objects;
}
var transformed = [];
for (var i = 0; i < objects.length; i++) {
transformed[i] = transformer(objects[i]);
}
return filtered = Filter(transformed, expression);
}
}]
);
这是我尝试使用它的方式:
<tr ng-repeat="item in list.items | ui.filter.transformFilter:list.transformerFunction:list.search" ng-click="list.select({'item': item})" class="list-item">
<td ng-repeat="label in list.labels" ng-bind-html="item[label.key]"></td>
</tr>
哦,理想情况下 ngClick 返回原始对象,但我总是可以在它周围包装一个函数来查找它。
【问题讨论】:
-
我想我知道解决方案 :) 我正在努力。
-
你有
list.labels的一些样本数据吗?
标签: angularjs angularjs-ng-repeat angularjs-filter