我不确定这scope.$watch
是否符合您的期望;scope.$watch
将一个表达式作为其第一个参数,以在当前范围内求值;当该表达式返回一个新值时,它将使用新值调用第二个参数,一个函数。因此,
scope.$watch('ready', function() {...});
和说的基本一样
每次scope.ready
更改时调用此函数。
这显然不是你想要的。
关于你的功能——你可以通过几种方法来实现这样的东西。第一个是一个简单的过滤器:
app.filter('timeago', function() {
return function(time) {
if(time) return jQuery.timeago(time);
else return "";
};
});
<p>The timestapm was {{conversation.timestamp|timeago}} ago.</p>
但是,在这种情况下,只要在作用域上运行摘要循环,返回的字符串就会自动刷新。
要只处理时间戳一次,您可以使用如下指令:
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>
这是一个演示所有三个示例的 jsFiddle。请注意,第三个示例(使用过滤器)每分钟自动更新的唯一原因是因为第二个示例(timeagoAutoupdate
指令)正在调用scope.$eval
.