我正在尝试创建一个过滤器,以角度js显示已过去的日期和时间,并且工作正常。现在我正在尝试向它添加转换,但那时它显示的是键而不是值。我认为问题是因为在执行过滤器时没有加载转换。
我正在尝试像
这样的代码进行翻译 if(hours){
result+= " "+hours+$translate.instant("elapsedFull.hours");
}
if(minutes){
result+= " "+minutes+$translate.instant("elapsedFull.minutes");
}
if(seconds){
result+= " "+seconds+$translate.instant("elapsedFull.seconds");
}
请检查plunker链接,让我知道如何解决问题。
答案 0 :(得分:2)
您的过滤器应该是一个有状态的过滤器,如下所示:
var elapsedFull = function($translate,$timeout){
function myFilter(date){
var duration = Date.now() - date;
var seconds = (duration / 1000) | 0;
duration -= duration * 1000;
var minutes = (seconds / 60) | 0;
seconds -= minutes * 60
var hours = (minutes / 60) | 0;
minutes -= hours * 60;
var days = (hours / 24) | 0;
hours -= days * 24;
var result="";
if(days){
result = days+"d";
}
if(hours){
result+= " "+hours+$translate.instant("elapsedFull.hours");
}
if(minutes){
result+= " "+minutes+$translate.instant("elapsedFull.minutes");
}
if(seconds){
result+= " "+seconds+$translate.instant("elapsedFull.seconds");
}
return result;
}
myFilter.$stateful = true;
return myFilter;
}
如果给出相同的参数,AngularJS假定您的过滤器函数返回相同的结果。因此,它缓存过滤结果以避免调用过滤器。那么,如果你想异步计算过滤器的结果怎么办?过滤器不能返回一个promise,它必须返回一些值,至少是一个undefined。它最好的希望是将来再次重新计算价值并返回其他东西。此类过滤器称为有状态,它们要求在返回的函数上将属性$stateful
设置为true
。