我正在尝试对过滤器中的对象应用转换,这会导致返回一组新对象。这是因为我想在应用转换后过滤对象并显示转换结果。然而,我最终得到了无限的摘要,因为我显示的对象与我放入的对象不同(当比较它们时)$$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
返回原始对象,但我总是可以在它周围包装一个函数来查找它。
解决此问题的一种方法是,您有一个幂等函数,由于对象 ID,Angular 认为该函数不是幂等的(因此会导致您提到的 $digest 循环问题):使用破折号/下划线_.memoize http://lodash.com/docs#memoize缓存函数的结果.
这将保证对于任何给定的缓存键,您的过滤器将始终返回完全相同的对象(包括$$id
)。这样你就不用玩游戏了$$id
你得到无需重新计算过滤结果的性能优势在每个 $digest 循环上。
以下是缓存过滤器结果的方法:
return _.memoize(function(objects, transformer, expression) { ... },
function(objects,transformer,expression){
return objects +transformer.name + expression;
});
针对您的情况的一个重要说明是,默认情况下_.memoize
使用第一个函数参数(objects
在本例中)作为缓存键。由于给定不同的转换器函数和表达式,您的过滤器可能会产生不同的结果,因此我添加了可选的第二个参数 - 一个使用的哈希函数objects
,expression
,以及名称transformer
函数来生成缓存键。
这是使用此代码的简化版本:fiddle http://jsfiddle.net/hK6tg/1/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)