编辑:我想我应该让事情变得更加明显 我想要做的是使每分钟自动刷新的提交日期显示“超前”的功能,以便即使模板没有重新渲染也能保持相对准确。
我想在模板中自动更新我的timeago值,但它不起作用。
我试图根据类似问题的答案(https://stackoverflow.com/a/17933506)
设置具有反应函数的代码这是我的代码:
var timeAgoDep = new Deps.Dependency(); // !!!
var timeAgo;
var timeAgoInterval;
Template.postItem.created = function() {
function getTimeago() {
//var now = new Date();
timeAgo = moment(this.submitted).twitter();
timeAgoDep.changed(); // !!!
};
getTimeago(); /* Call it once so that we'll have an initial value */
timeAgoInterval = Meteor.setInterval(getTimeago, 5000);
};
Template.postItem.posted = function() {
timeAgoDep.depend(); // !!!
return timeAgo;
};
Template.postItem.destroyed = function() {
Meteor.clearInterval(timeAgoInterval);
};
我很确定问题来自于this.submitted,因为如果我分配timeAgo = now例如,它会显示时间和更新,就像它应该的那样。
我也知道时刻(this.submitted).twitter()工作正常,因为当我所做的只是通过帮助器返回它时,它可以工作。
答案 0 :(得分:1)
更好的方法是接受Meteor的反应性并反复渲染与时间相关的值。在您的情况下,问题是您每5秒为每个postItem
呈现的使依赖项无效,这将很快变成一团糟。
请参阅https://github.com/mizzao/meteor-timesync以获取在客户端上提供反应时间变量的程序包(它们也会同步到服务器时间!)它基本上可以按照您想要的方式执行,但方式更清晰。 (免责声明:我写了这个包。)
您可以以相同的方式使用时刻来计算要显示的实际字符串。例如,摆脱所有其他东西,只需使用
Template.postItem.posted = function() {
return moment(this.submitted).from(TimeSync.serverTime());
}
moment().twitter()
扩展名似乎不是一个好选择,因为它只使用当前客户端时间,并且不允许您传入特定(即服务器同步)时间或无效值。