Javascript 流星:重新创建vs重新渲染

Javascript 流星:重新创建vs重新渲染,javascript,meteor,dynamic-arrays,Javascript,Meteor,Dynamic Arrays,困境: 已创建:模板尚未呈现(仅激发一个) 每个模板的时间) onrendered:模板被渲染(多次激发) 是否可以仅在模板完全呈现后启动函数 我有一个邮件列表,看起来像这样 <template name="messages"> <div id="messages"> <span class="message">{{this.message}}</span> </div> </template&

困境:

  • 已创建:模板尚未呈现(仅激发一个) 每个模板的时间)
  • onrendered:模板被渲染(多次激发)
是否可以仅在模板完全呈现后启动函数

我有一个邮件列表,看起来像这样

<template name="messages">
    <div id="messages">
        <span class="message">{{this.message}}</span>
    </div>
</template>
通过创建并更改模板以包含单个消息而进行的交换,使函数为每个新消息运行一次。这意味着lastmessage变量采用倒数第二个值:

Template.message.created = function() {
    var username = Meteor.user().services.twitter.screenName;

    var lastmessage = $('.message').last().text();//this is not the last message
    if (lastmessage.indexOf(username) > -1) {
        //Do something
    }
}

通过将代码包装在setTimeout函数中修复了此问题。

老实说,您不能在“渲染”中执行类似操作。或者,在将额外的内容呈现到DOM中之后,可以加入一些回调

此外,还可以使用
self.autorun(()=>{if(self.alreadyRun)return;…})
self.alreadyRun=new ReactiveVar(false)

只是猜测而已

var self = this;

self.alreadyRun = false;
if(self.alreadyRun){
    self.alreadyRun = true;

    // run once code here

}

假设onRendered只触发一次:“当Template.myTemplate的实例第一次呈现到DOM节点并放入文档中时,使用此方法添加的回调将被调用一次。”在我的情况下,新消息会不断追加到模板中,并且会为每条消息重新提交。设置超时似乎是唯一有效的方法,尽管它可能不在Meteor的最佳实践书中。@Fullhdpixel在javascript或任何其他编程语言中也不是一个好的实践,在这种情况下。。。这是对你的代码进行黑客攻击,如果你像这样对代码进行黑客攻击,那么维护这样的代码将变得越来越困难。您应该以某种方式了解onRendered被多次触发的原因。此外,我不确定您为什么要在onRendered/onCreated中执行此操作,但看起来此功能的适当位置应该是在帮助器中,但是在这里,您必须考虑到助手被称为multiple timesMeteor.defer也用于相同的目的。
var self = this;

self.alreadyRun = false;
if(self.alreadyRun){
    self.alreadyRun = true;

    // run once code here

}