页面重新呈现集合更新

时间:2013-08-13 18:21:39

标签: javascript mongodb meteor

我正在制作一个简单的多用户播放列表应用程序。我有一个客户端正在观看视频流,另一个我试图将视频添加到该播放列表中。视频正确地添加到播放列表,但是当更新发生时,页面重新呈现并且视频在刚刚观看的客户端上重新开始。我试图得到它,以便当其他用户将视频添加到播放列表时,它会继续为所有正在观看它的人播放。

在服务器上我有:

Meteor.publish('videosQue', function (room_id) {
  return Videos.find({room_id: room_id});
});

在客户端我将其设置为todo示例:

var videosHandle = null;
Deps.autorun(function(){
  var room_id = Session.get('room_id');
  if (room_id)
    videosHandle = Meteor.subscribe('videosQue', room_id);
  else
    videosHandle = null;
});

然后这里有一些适用于某个人在一个房间的代码:

Template.EnteredRoom.loading = function () {
  return videosHandle && !videosHandle.ready();
};

Template.EnteredRoom.room = function () {
  return Rooms.findOne(Session.get('room_id'));
};

Template.EnteredRoom.video_objs = function () {
  Session.set('videos', Videos.findOne({room_id: Session.get('room_id')}))
  return Session.get('videos');
};

Template.EnteredRoom.rendered = function () {
  if (Session.get('videos') && Session.get('videos').videoIds.length) {
    var currVid = 0, playlist = Session.get('videos').videoIds;
    renderVid(playlist, currVid);
  };
};

var renderVid = function(playlist, currVid) {
  var video = Popcorn.youtube('#youtube-video', 'http://www.youtube.com/embed/' + playlist[currVid] + '&autoplay=1');

  video.on("ended", function() {
    if (++currVid < playlist.length) 
      renderVid(playlist, currVid);
    else {
      $('#youtube-video').hide();
      $('#video-container').append('<div style="font-size:30px;color:white;">No Videos :( Try adding one!</div>');
    }
  });
}

无论如何要完成这项工作?

感谢您的帮助!

安德鲁

编辑: 在做了一些阅读后,我认为我应该以某种方式使用isolate来实现这一点,任何建议?

1 个答案:

答案 0 :(得分:0)

我认为您可以尝试在{{#constant}}块中放置不需要反应的部分。

{{#constant}}
    {{#each ...}}
    ....
    {{/each}}
{{/constant}}

我更喜欢在模型函数中使用{reactive:false}选项禁用来自集合的反应:

{{1}}