我认为你无法通过过滤器来实现这一目标。原因$scope.$apply()
不起作用是因为它正在监视数据的变化。由于数据实际上没有改变,因此过滤器永远不会再次被调用。
相反,您需要调整控制器中查看的数据。使用$timeout
代替setInterval
因为它已融入消化生命周期中。
我会考虑使用指令来执行此操作。
app.directive('relativeTime', function($timeout) {
function update(scope, element) {
element.text(getRelativeDateTimeString(scope.actualTime));
$timeout(function() { update(scope, element); }, 1000);
}
return {
scope: {
actualTime: '=relativeTime'
},
link: function(scope, element) {
update(scope, element);
}
};
});
所以你可以像这样使用指令:
<div relative-time="theDate"></div>
另外,我发现你的一个缺陷getRelativeDateTimeString
功能。您需要根据当前时间确定增量。getSeconds
只是给你给定时间的秒数:
var delta = parseInt(((new Date().getTime()) - dt.getTime()) / 1000);
这是一个工作CodePen http://codepen.io/BrianGenisio/pen/abuol.