【发布时间】:2015-05-28 03:51:47
【问题描述】:
我想知道有没有办法知道#each 循环是否“准备好”。 “就绪”是指它渲染所有节点并插入到 DOM 中。我什至不谈论onRendered 回调(旧的rendered)。我试过了
<template name="myTemplate">
<div class="some-class">
{{#if Template.subscriptionsReady}}
{{#each messages}}
<div>{{text}}</div>
{{/each}}
<script>
$(".some-class").trigger("LOOP_READY")
</script>
{{/if}}
</div>
</template>
Template.myTemplate.onRendered(function(){
this.$(".some-class").on("LOOP_READY", doSomething)
})
但它也不起作用。我不想使用计时器。
更新
messages 是当前对话的文本消息集合,dialogId 是存储在Session 中的反应变量。
Template.myTemplate.onCreated(function(){
var self = this;
self.autorun(function(){
self.subscribe("messages", Session.get("dialogId"))
})
})
因此,如果有人更改了 dialogId,myTemplate 会加载另一个对话框消息,我想知道这些消息何时准备好,以滚动到特定消息。简单的onReady 不起作用,因为在所有消息都呈现并获得自己的高度之前,我无法准确地调用 scrollTop。
【问题讨论】:
-
你确定
onRendered和waitOn(见铁路由器)或类似的不起作用吗?我可以想象您看到的触发器是从模板第一次呈现时开始的,即当还没有数据可用时。而且我怀疑您希望它仅在数据到达并且所有each都已呈现时触发。你在等数据吗? -
@ZuzEL 你能解释一下你为什么想要这个吗?需要初始化插件什么的吗?
-
我认为,如果我得到你想要的,你的 scrollToTop 在新元素被添加之前就被触发了。所以从技术上讲,如果你只是破解并将 scrollToTop 放入 setTimeout(func,0) 调用中,当你调用 scroll 时元素高度将被更新。
标签: javascript meteor meteor-blaze