10

フィルターを使用して、何かが追加されてからの時間を表示しています。

angular.module('filters').('fromNow', function () {
    return function (date) {
        return moment(date).fromNow();
    }
});

前の時間が更新されるように、毎分フィルターを自動的にトリガーするにはどうすればよいですか。これを実現するためにフィルター内で $timeout を使用できますか?

ありがとう!

4

1 に答える 1

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

    }  
  ]
);

HTML:

<div ng-controller="AppController">
  Time: <span time="2013-03-23 21:56"></span>
</div>

プランカー

繰り返しになりますが、Directive Docsを見ると、この解決策は、そのページにあるディレクティブの例のほぼ完全なぼったくりであることがわかります。

于 2013-03-23T21:04:40.617 に答える