自动刷新过滤器

doo*_*man 10 angularjs

我使用过滤器显示时间以来添加了一些内容:

angular.module('filters').('fromNow', function () {
    return function (date) {
        return moment(date).fromNow();
    }
});
Run Code Online (Sandbox Code Playgroud)

如何在每分钟自动触发过滤器,以便更新时间.我可以在过滤器内使用$ timeout来实现这个目的吗?

谢谢!

Ste*_*wie 18

事实上,您的功能实际上已经在Angular Docs上进行了非常详细的描述.

对于这类事情,您需要使用指令.您可以选择将过滤逻辑保留在过滤器功能中,也可以将整个"超时"逻辑放在指令中.无论你想要哪种方式.

JS:

app.filter('fromNow', function () {
  return function (date) {
    return moment(date).fromNow();
  };
});

app.directive('time', 
  [
    '$timeout',
    '$filter',
    function($timeout, $filter) {

      return function(scope, element, attrs) {
        var time = attrs.time;
        var intervalLength = 1000 * 10; // 10 seconds
        var filter = $filter('fromNow');

        function updateTime() {
          element.text(filter(time));
        }

        function updateLater() {
          timeoutId = $timeout(function() {
            updateTime();
            updateLater();
          }, intervalLength);
        }

        element.bind('$destroy', function() {
          $timeout.cancel(timeoutId);
        });

        updateTime();
        updateLater();
      };

    }  
  ]
);
Run Code Online (Sandbox Code Playgroud)

HTML:

<div ng-controller="AppController">
  Time: <span time="2013-03-23 21:56"></span>
</div>
Run Code Online (Sandbox Code Playgroud)

Plunker

同样,如果你看一下Directive Docs,你会发现这个解决方案几乎完全是在该页面上找到的指令示例.

  • 你可以直接注入自定义过滤器,而不是使用$ filter,如果你想:`app.directive('time',['$ timeout','fromNowFilter',function($ timeout,fromNowFilter){` (4认同)