流星:oncreated vs onrendered

Ful*_*xel 6 javascript dynamic-arrays meteor

困境:

  • oncreated:模板尚未渲染(每个模板仅触发一次).
  • onrendered:渲染模板(多次触发).

是否可以在模板完全渲染后触发函数?

我有一个类似于此的消息列表

<template name="messages">
    <div id="messages">
        <span class="message">{{this.message}}</span>
    </div>
</template>
Run Code Online (Sandbox Code Playgroud)

每次将新消息插入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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过创建和更改模板呈现的交换包含单个消息,使该函数对每个新消息运行一次.这意味着它需要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
    }
}
Run Code Online (Sandbox Code Playgroud)

Ful*_*xel -2

通过将代码包装在 setTimeout 函数中解决了这个问题。