0

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

在我的服务器上:

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

有没有办法完成这件事?

谢谢您的帮助!

安德鲁

编辑:在做了一些阅读之后,我认为我应该以某种方式使用隔离来实现这一点,有什么建议吗?

4

1 回答 1

0

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

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

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

    返回 collection.find({}, {reactive:false}) }

于 2013-08-13T19:46:44.600 回答