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
}