あなたが期待していることscope.$watch
がうまくいくかどうかはわかりません。scope.$watch
現在のスコープで評価する式を最初の引数として取ります。その式が新しい値を返すと、2 番目の引数である関数が新しい値で呼び出されます。したがって、
scope.$watch('ready', function() {...});
と言うのと基本的には同じです。
変更するたびにこの関数を呼び出しscope.ready
ます。
これは明らかにあなたが望むものではありません。
機能については、このようなものを実装する方法がいくつかあります。1 つ目は単純なフィルターです。
app.filter('timeago', function() {
return function(time) {
if(time) return jQuery.timeago(time);
else return "";
};
});
<p>The timestapm was {{conversation.timestamp|timeago}} ago.</p>
ただし、この場合、スコープでダイジェスト サイクルが実行されるたびに、返された文字列が自動的に更新されます。
タイムスタンプを 1 回だけ処理するには、次のようなディレクティブを使用できます。
app.directive('timeago', function($timeout) {
return {
restrict: 'A',
link: function(scope, elem, attrs) {
scope.$watch(attrs.timeago, function(value) {
if(value) elem.text(jQuery.timeago(value));
});
}
};
});
<p>The timestamp was <span timeago="conversation.timestamp"></span> ago.</p>
これは、15 秒ごとにダイジェスト サイクルを再実行し、タイムスタンプを頻繁に自動的に更新するバージョンです。
app.directive('timeago', function($timeout) {
return {
restrict: 'A',
link: function(scope, elem, attrs) {
var updateTime = function() {
if (attrs.timeagoAutoupdate) {
var time = scope.$eval(attrs.timeagoAutoupdate);
elem.text(jQuery.timeago(time));
$timeout(updateTime, 15000);
}
};
scope.$watch(attrs.timeago, updateTime);
}
};
});
<p>The timestamp was <span timeago="conversation.timestamp"></span> ago.</p>
以下は、 3 つの例すべてを示すjsFiddleです。3 番目の例 (フィルターを使用) が毎分自動的に更新される唯一の理由は、2 番目の例 (timeagoAutoupdate
ディレクティブ) が を呼び出しているためであることに注意してくださいscope.$eval
。