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);
});
},
};
});