我想使用jQuery实现这个插件的功能: https://github.com/rmm5t/jquery-timeago
该插件的简短描述:
这将使用一类timeago和ISO来转换所有abbr元素 标题中的8601时间戳(符合日期时间设计模式 微格式):
<abbr class="timeago" title="2011-12-17T09:24:17Z">December 17, 2011</abbr>
这样的事情:
<abbr class="timeago" title="December 17, 2011">about 1 day ago</abbr>
除了使用淘汰赛,我的标记看起来像这样:
<abbr data-bind="attr: { title: Posted }" class="timeago"></abbr>
我觉得有些东西没有同步,因为即使我把这个调用放在viewmodel本身内也没有发生任何事情。我猜我需要一个附加到可观察的“发布”的订阅者,但我不知道如何设置它。
答案 0 :(得分:22)
你的方法不起作用,因为timeago通过jQuery的data()函数创建一个缓存。因此,仅仅更新标题是不够的。
我认为自定义绑定是最好和最干净的方法:
ko.bindingHandlers.timeago = {
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
var $this = $(element);
// Set the title attribute to the new value = timestamp
$this.attr('title', value);
// If timeago has already been applied to this node, don't reapply it -
// since timeago isn't really flexible (it doesn't provide a public
// remove() or refresh() method) we need to do everything by ourselves.
if ($this.data('timeago')) {
var datetime = $.timeago.datetime($this);
var distance = (new Date().getTime() - datetime.getTime());
var inWords = $.timeago.inWords(distance);
// Update cache and displayed text..
$this.data('timeago', { 'datetime': datetime });
$this.text(inWords);
} else {
// timeago hasn't been applied to this node -> we do that now!
$this.timeago();
}
}
};
用法就像这样简单:
<abbr data-bind="timeago: Posted"></abbr>
答案 1 :(得分:1)
这是另一种选择,它可能与Niko的答案相比没有任何优势,除非是简单的触摸:) -
usf.ko.bindings['timeago'] = {
update: function(element, valueAccessor) {
var $element, date;
date = ko.utils.unwrapObservable(valueAccessor());
$element = $(element);
if (date) {
$element.attr('title', date.toISOString());
$element.data('tiemago', false);
return $element.timeago();
}
}
};