2014-09-09 8 views
1

Я использую Meteor v0.9.1.1 для заполнения небольшого приложения мгновенного сообщения. Это мой chat_box шаблон:Meteor - Как узнать, полностью ли загружены данные в шаблон

<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, а не когда все сообщения загружаются с сервера.

Итак, вопрос в том, как узнать, когда все сообщения полностью загружены в шаблон, так что после этого я смогу правильно выполнить $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 
      } 
     } 
     } 

Я stucked этой проблемой в течение нескольких часов. Любая помощь будет очень оценена. Спасибо, ребята, продвинутые!

ответ

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()); 
    }) 
}; 

Pass onReady обратного вызова Meteor.subscribe:

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

Всякий раз Session.get("chatBoxSubscriptionCompleted") изменен, тогда закрытие в Tracker.autorun is bein g выполнено.

+0

Приятный трюк! Спасибо за ваш ответ :) – sonlexqt

+0

Действительно ли это единственный способ сделать это? Я бы подумал, что Метеор будет лучше, например. var my_data = Meteor.subscribe ('my_collection'); if (my_data) {... данные загружены, так что сделайте что-то ...} – JoeTidee