Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重新评估AngularJS中计时器上的过滤器_Javascript_Angularjs_Angularjs Filter_Angular Directive - Fatal编程技术网

Javascript 重新评估AngularJS中计时器上的过滤器

Javascript 重新评估AngularJS中计时器上的过滤器,javascript,angularjs,angularjs-filter,angular-directive,Javascript,Angularjs,Angularjs Filter,Angular Directive,我有一个过滤器,用于显示相对时间,即5分钟前。我希望能够使这个过滤器(或写一个指令)每分钟重新评估一次。我该怎么做 JS过滤器 m.filter('relativeTime', function () { return function (input, showAgo) { if (typeof showAgo == "undefined") { showAgo = true; } var dateMoment =

我有一个过滤器,用于显示相对时间,即
5分钟前
。我希望能够使这个过滤器(或写一个指令)每分钟重新评估一次。我该怎么做

JS过滤器

m.filter('relativeTime', function () {
    return function (input, showAgo) {
        if (typeof showAgo == "undefined") {
            showAgo = true;
        }

        var dateMoment = input;
        if (typeof input == "string") {
            dateMoment = moment(input);
        }

        return dateMoment.fromNow(showAgo);
    };
});
HTML

{{activity.Time}相对时间}

虽然可以创建有状态过滤器,但文档中只允许创建无状态过滤器和幂等过滤器。这就是为什么指令在这里是一个更好的主意

原理很简单:在编译指令时,创建一个每分钟刷新一次值的计时器。这是一个完美的目标。然而,正如文档所述,当您不再需要它时,不要忘记销毁它

MyApp.directive('relativeTime', function ($interval) {
    return {
        scope: {
            time: '=',
        },
        template: '<div>{{relativeTime}} secondes ago.</div>',
        link: function ($scope) {
            $scope.relativeTime = 0;

            var intervalPromise = $interval(function () {
                ++$scope.relativeTime;
            }, 1000);

            $scope.$watch('time', function (time) {
                var currentTime = new Date();
                $scope.relativeTime = Math.round((currentTime.getTime() - time.getTime()) / 1000);
            });

            $scope.$on('$destroy', function () {
                $interval.cancel(intervalPromise);
            });
        },
    };
});
MyApp.directive('relativeTime',函数($interval){
返回{
范围:{
时间:'=',
},
模板:“{{relativeTime}}秒前。”,
链接:功能($scope){
$scope.relativeTime=0;
var intervalPromise=$interval(函数(){
++$scope.relativeTime;
}, 1000);
$scope.$watch('time',函数(time){
var currentTime=新日期();
$scope.relativeTime=Math.round((currentTime.getTime()-time.getTime())/1000);
});
$scope.$on(“$destroy”,函数(){
$interval.cancel(intervalPromise);
});
},
};
});


出于演示目的,该指令非常简单,每秒钟更新一次。但是,根据您的用例,特别是您的
date.fromNow()
函数来调整它应该并不困难。

您好,谢谢您的回答,没有模板我还能做吗?理想情况下,我想要一个指令,它只是以某种方式重新评估我应用该指令的项目上的所有过滤器。或者如果失败,只需使用新的相对时间更新内容,而不必指定模板(因为我在特定模板可能导致问题的各个地方使用该模板)@Chris我看不出使用指令如何会导致问题,这只是一个简单的
(或者
,或者你想要的任何东西)。你能告诉我一些细节吗?
MyApp.directive('relativeTime', function ($interval) {
    return {
        scope: {
            time: '=',
        },
        template: '<div>{{relativeTime}} secondes ago.</div>',
        link: function ($scope) {
            $scope.relativeTime = 0;

            var intervalPromise = $interval(function () {
                ++$scope.relativeTime;
            }, 1000);

            $scope.$watch('time', function (time) {
                var currentTime = new Date();
                $scope.relativeTime = Math.round((currentTime.getTime() - time.getTime()) / 1000);
            });

            $scope.$on('$destroy', function () {
                $interval.cancel(intervalPromise);
            });
        },
    };
});