这是一个例子:
app.filter("testf", function($timeout) { var data = null, // DATA RECEIVED ASYNCHRonOUSLY AND CACHED HERE serviceInvoked = false; function realFilter(value) { // REAL FILTER LOGIC return ...; } return function(value) { // FILTER WRAPPER TO COPE WITH ASYNCHRonICITY if( data === null ) { if( !serviceInvoked ) { serviceInvoked = true; // CALL THE SERVICE THAT FETCHES THE DATA HERE callService.then(function(result) { data = result; }); } return "-"; // PLACEHOLDER WHILE LOADING, COULD BE EMPTY } else return realFilter(value); }});这个小提琴是一个使用超时而不是服务的演示。
编辑:根据sgimeno的评论,必须格外小心,不要多次致电该服务。请查看
serviceInvoked上面代码中的更改和小提琴。另请参阅Angular
1.2.1的分叉小提琴和一个用于更改值并触发摘要循环的按钮:分叉小提琴
编辑2:根据MihaEržen的评论,此解决方案对Angular1.3没有记录程序。该解决方案几乎是微不足道的,虽然,使用
$stateful过滤器标志,记录在这里下的“状态过滤器”,以及必要的分叉小提琴。
请注意 ,此解决方案会损害性能,因为每个摘要循环都称为过滤器。根据具体情况,性能下降是否可以忽略不计。



