自定义过滤器中的角度转换问题

时间:2017-02-06 08:35:19

标签: javascript angularjs

我正在尝试创建一个过滤器,以角度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链接,让我知道如何解决问题。

Plunker

1 个答案:

答案 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