【发布时间】:2019-06-13 07:31:44
【问题描述】:
我有一个 Angular 应用程序,我想实现一个“Time Ago”功能。如果我提出一些疯狂的“问题”,这会是个坏主意吗?
如果你能想象一个 Facebook 帖子说“大约一分钟前发布...”,这就是我要拍摄的内容。
假设用户从未刷新页面,问题被附加到来自signlar hub的角度mdoel
export interface IQuestion {
timeAgo: string;
}
export class Question implements IQuestion {
public timeAgo: string;
constructor(question: IQuestion) {
this.timeAgoTicker();
}
timeAgoTicker(): void {
this.timeAgo = 'just now';
setTimeout( () => this.timeAgo = 'about a minute ago', 10000);
setTimeout( () => this.timeAgo = 'a couple of minutes ago', 20000);
setTimeout( () => this.timeAgo = '5 minutes ago', 50000);
// etc...
}
}
【问题讨论】:
-
嗯,我希望有一个超时来查看所有问题并使用 switch 语句在页面上更新它们。这会增加页面的负载(虽然不是什么大问题)
-
我应该提到,问题正在通过 SignalR 实时传递。假设“何时启动计时器”的管理是准确的。
-
这有点远离将我们的模型与我们的演示文稿分开。有道理?多语言等呢?我认为这个想法很酷。但我仍然会集中刷新查看模型集合的表示层。
-
如果你看一下 StackExchange 是如何做到这一点的,他们确实会启动一个 60000 毫秒的间隔来查找所有
$('span.relativetime, span.relativetime-clean'),然后根据 currentTime 更新他们的 textContent。 (在full.js) -
如果你整理 full.js,你会发现有一个工厂
StackExchange.realtime可以做到这一点。搜索relativetime找到函数L(将来可能会更改),然后搜索在同一范围内调用此函数的位置(它在当前版本的函数r中),然后就可以了会看到它是在一个函数内部调用的,它本身每 60000 毫秒调用一次。
标签: javascript angular settimeout