Javascript 在每个循环完成从集合中呈现项目后执行代码

Javascript 在每个循环完成从集合中呈现项目后执行代码,javascript,meteor,Javascript,Meteor,我正在构建基本的聊天应用程序,只是为了试用meteor。当用户进入聊天频道时,向他显示底部的最新消息是合乎逻辑的。现在,我正试图通过以下代码实现这一点 模板管理器 Template.messages.rendered = function(){ var message_container = this.find('.messages'); var height = message_container.scrollHeight; $(message_container).animate

我正在构建基本的聊天应用程序,只是为了试用meteor。当用户进入聊天频道时,向他显示底部的最新消息是合乎逻辑的。现在,我正试图通过以下代码实现这一点

模板管理器

Template.messages.rendered = function(){
  var message_container = this.find('.messages');
  var height = message_container.scrollHeight;
  $(message_container).animate({scrollTop: height}, 1000)
};
模板

<template name="messages">
   <div class="messages">
     {{# each messages}}
   {{> message}}
     {{/each}}
   </div>
</template>

{{{#每条消息}
{{>消息}
{{/每个}}

问题是模板管理器中的代码正在执行,而不是所有消息都已呈现,因此会导致高度不正确,在var height中。

这与《发现流星》一书中的显微镜演示应用程序类似-渲染方法的问题在于,您无法确定在带数据的模板完成渲染时是触发了此瓶颈,还是在填充数据之前仅触发了模板渲染。解决方法可能是跟踪某些本地集合中的消息计数,或者只是在呈现的变量中检查当前消息计数是否比以前更大。如果是这样,请向下滚动一个窗口

这一方法在上述书的第14章(如果我没有弄错的话)中使用

简单的肮脏技巧可能只是在渲染中测试超时,但我不建议这样做


哦,还有一个肮脏的技巧是在页面的dom树的末尾添加一些不可见的元素,这样所有的新消息都应该在它之前插入。然后只需在此元素位置更改上添加一个事件处理程序。每次呈现新消息时,它都会将该元素向下推一点,因此会触发一个事件。在该事件处理程序中,添加向下滚动的代码。也可以找到类似的解决方案。

如果在呈现消息模板时调用animate怎么办?scroll会出现问题。它被卡在一个地方然后又卡在另一个地方。你在流星0.8.x里吗?