流星:未创建与未渲染

Meteor: oncreated vs onrendered

本文关键字:创建 流星      更新时间:2023-09-26

困境:

  • 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
        }
    }
}

由created&将模板更改为包含单个消息,会使函数为每个新消息运行一次。这意味着它为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
    }
}

老实说,你不能在"rendered"中做这样的事情吗。或者,您可以在将额外的东西呈现到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
}

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