【发布时间】:2015-05-20 15:14:00
【问题描述】:
假设你有一个带有方法的对象:
/*
chat.author == a String
chat.message == a String
chat.timestamp == a Date
chat.timeago() == a method that returns a string, like "2 minutes ago"
*/
你的 html 看起来像这样:
<div>{{ chat.author }}</div>
<div>{{ chat.message }}</div>
<div>{{ chat.timeago() }}</div>
chat.timeago() 的返回值会根据从chat.timestamp 开始经过的时间而变化,所以它可能会从“刚刚”、“几秒钟前”、“一分钟前”、“ 2 小时前”等。
存在哪些选项来指示 Angular 何时更新绑定到方法的数据,哪个选项是 Angular 中最优雅或最传统的方式?
【问题讨论】:
-
我建议使用指令来表示 timeago,并使用特定的间隔并在 UI 上手动绘制它,使用原生 DOM 操作,如
innerHTML,甚至使用 jqlite .text/.html。如果您使用 $timeout, $interval(very bad) 它将再次运行摘要周期以及所有观察者......只是为了更新 timeago 它是一种过度杀伤力,尤其是当您的应用程序变大时。使用角度,您需要回复摘要周期以更新绑定,并且最终会超时等......这有其自身的缺点。 -
@PSL 好点在这里。指令将是实现这一目标的一种更难但更好的方法。
-
@Okazari 是的,但这绝对值得,但不会更难实施。在上次 ng-conf 中看到有一个演示文稿对此进行了讨论,即使对于 mouseover/mouseout 效果也不使用 ng-* 事件,而只是手动绑定事件。在较大的 ui 上或(当它变大时)您最终会遇到严重的性能问题。因此,只有在真正值得时才调用摘要循环..
-
@PSL 一般来说,我不喜欢使用自定义指令。它几乎总是做一些你可以用角度内置服务/指令做的事情,或者它不是指令的目的。据我所知,指令旨在向某些组件添加行为。这正是一个很好的自定义指令的一个很好的用例。0之类的东西。你有关于这些信息的链接吗?我对此很感兴趣。
-
@PSL 我喜欢这种思维方式。它真的很适合 Angular 的。感谢您提供的信息,我会尽快观看。
标签: javascript angularjs data-binding