流星:oncreated vs onrendered

时间:2015-03-26 16:45:22

标签: javascript meteor dynamic-arrays

困境:

  • oncreated:模板尚未呈现(仅触发一个模板) 每个模板的时间)。
  • onrendered:呈现模板(多次触发)。

只有在模板完全渲染后才可以触发函数吗?

我有一个类似于此

的消息列表
<template name="messages">
    <div id="messages">
        <span class="message">{{this.message}}</span>
    </div>
</template>

每次将新消息插入DOM时,我想知道消息的文本是否包含用户名。

以下代码段运行多次,其中只应运行一次。

Template.messages.rendered = function() {

    var username = Meteor.user().services.twitter.screenName;
    $("#messages").bind("DOMSubtreeModified", function() {    
        var lastmessage = $('.message').last().text();
        if (lastmessage.indexOf(username) > -1) {
            //Do something
        }
    }
}

由创建的&amp; amp;呈现的交换更改模板以包含单个消息,使该函数对每个新消息运行一次。这意味着它需要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
    }
}

2 个答案:

答案 0 :(得分:1)

老实说你不能在“渲染”中做这样的事情。或者,在将额外的内容渲染到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

}

答案 1 :(得分:-2)

通过将代码包装在setTimeout函数中来解决此问题。