Meteor - 如何知道数据是否完全加载到模板中

时间:2014-09-09 09:08:33

标签: templates meteor complete subscribe

我正在使用Meteor v0.9.1.1填充小型即时消息应用。 这是我的chat_box模板:

    <ul>
       {{#each messages}}
       <li class="msgLine">
          <strong style="color: {{userTextColor userId}}">
             {{userEmail}}
          </strong>
          {{userMsg}}
          <span>
             {{createdAt}}
          </span>
       </li>
   </ul>

我想要做的是,当用户打开此模板时,将关注最后一条消息行。所以我通过使用:

来做到这一点
Template.chat_box.rendered = function(){
  var $chat = $(".chatBox"); // get the div contains the messages list
  $chat.scrollTop($chat.height());
};

但它没有用。通过逐步调试,我发现Template.chat_box.rendered函数在DOM初始化之后运行,而不是从服务器加载所有消息。< / p>

所以问题是,我怎么知道所有消息何时完全加载到模板中,以便之后我可以正确运行$chat.scrollTop($chat.height());

这就是我通过发布/订阅获取消息列表的方式:

Meteor.subscribe('rooms_by_id', this.params._id);
      var currentRoomInfo = Rooms.find().fetch()[0];
      if (currentRoomInfo) {
        Meteor.subscribe('messages_by_room', this.params._id);
        var _messages = Messages.find().fetch();
        if (_messages){
          return {
            roomId: currentRoomInfo._id,
            roomTitle: currentRoomInfo.title.toUpperCase(),
            messages: _messages
          }
        }
      }

我已经被困在这个问题上好几个小时了。任何帮助将非常感激。谢谢你们先进的人!

1 个答案:

答案 0 :(得分:1)

您可以使用此处描述的技术: Meteorjs loading message

但是在你的情况下你应该做些改进:

Template.chat_box.rendered = function(){
  Tracker.autorun(function(){
    // every time "chatBoxSubscriptionCompleted" is changed, then closure is rerun
    Session.get("chatBoxSubscriptionCompleted");

    var $chat = $(".chatBox"); 
    $chat.scrollTop($chat.height());
  })
};

onReady回调传递给Meteor.subscribe

Meteor.subscribe(
   "chatData",
   param1,param2,
   {
     onReady:function(){
       Session.set("chatBoxSubscriptionCompleted",true)
     },
     onError:function(){}
   }
)

每当更改Session.get("chatBoxSubscriptionCompleted")时,Tracker.autorun中的闭包正在执行。