2016-08-02 46 views
2

我已经搜索并尝试了几个小时,但我无法为此提出任何解决方案。流星订阅已准备好不起作用

我正在写一个音乐应用程序,可以在服务器上播放来自YouTube的歌曲。我正在下载缩略图并将它存储在cfs:collection中(因为我稍后需要一个高斯模糊版本)。

我的发布方法如下所示:

Meteor.publish('currentSong', function() { 
    return [Playlist.find({'position': 0}), Thumbnails.find()]; 
}); 

我只出版了当前歌曲的缩略图版本,但造成更多的问题。

在我的模板onCreated方法我订阅(其他各种事情)。我已经尝试在this.autorun()方法和一个之外。

Template.controlpanel.onCreated(function() { 
    // subscribe to the publications 
    Meteor.subscribe('currentSong'); 
    Meteor.subscribe('status'); 
}); 

然后,我有一个模板帮助检索缩略图的URL实际上是一个<img src="<url>" />上下文中显示出来:

getThumbnail: function() { 
    if(Template.instance().subscriptionsReady()){ 
     var thumbnail = this.thumbnail.getFileRecord(); 
     if(!$.isEmptyObject(thumbnail)){ 
      return thumbnail.url({'store': 'Thumbnail'}); 
     } 
    } 
} 

因为有人问我一些更多的代码,这里是一个片段从实际的模板

{{#with currentSong}} 
<div id="ThumbnailDisplay">  
    <img src="{{getThumbnail}}" alt="{{title}} Thumbnail" id="thumbnail"> 
</div> 
{{/with}} 

凡currentSong只返回一个数据库条目,听下面的模式:

PlaylistSchema = new SimpleSchema({ 
    title: { 
     type: String, 
     label: "titlename" 
    }, 
    url: { 
     type: String, 
     label: "titleurl" 
    }, 
    duration: { 
     type: Number, 
     label: "duration" 
    }, 
    file: { 
     type: String, 
     label: "filepath", 
     optional: true 
    }, 
    position: { 
     type: Number, 
     label: "postion" 
    }, 
    // id to the Thumbnail CFS Collection object 
    thumbnail: { 
     // type: String, 
     type: FS.File, 
     label: "thumbnail" 
    } 
}); 

在这里您可以看到,在{{#with currentSong}}的上下文中的this.thumbnail指的是存储缩略图及其高斯模糊版本的FS.File对象。

问题是,当模板已经加载并且从一首歌曲切换到另一首时,它没有任何问题。但是当我的播放列表中没有歌曲时,显示部分不可见(模板在技术上呈现,但所有信息都位于{{#with currentSong}}块内)。当我插入歌曲时,显示屏会弹出并显示除缩略图以外的所有内容(歌曲标题,时长滑块等)。一旦我重新加载页面,它就在那里。

我正在订阅该集合。我查看订阅已准备就绪的天气,但仍无法使用。

我在我的应用程序中有一些其他部分,我在onCreated上下文中订阅,但仍然必须使用setTimeout (function(), 100),否则数据还不可用。

我很确定问题出在屏幕前,我错过了一些东西,或者没有完全理解Meteor的订阅以及哪部分是被动的。但我不明白。你的帮助将不胜感激。

有一点需要注意的是,我知道iron-router及其功能。我在另一个项目中使用过它。但这个应用程序是唯一的一个页面应用程序,根本不需要路由。所以我想限制使用它。

+0

您可能需要展示更多代码才能找到问题。具体来说,你如何从一个数组中的两个不同的游标(相当奇怪的...)发布到this.thumbnail –

+0

我已经编辑了这个问题来给你更多的代码。我希望这有帮助。出版物的哪一部分你觉得很奇怪?什么是适当的方式来做到这一点? – JHolub

+0

您是否在控制台中发现任何错误?有时在这些情况下,我发现客户端由于错误而导致停止处理,因为变量未定义 - 例如this.thumbnail可能未定义getFileRecord()被调用的位置 –

回答

1

所以在玩了更多一点后,问题基本上是订阅已准备就绪,但CollectionFS文件不是。

我的解决办法,现在,我有我的帮手,被动设置正确的URL,它始终工作除了当模板第一次呈现。

为了解决这个问题我有一个自动运行功能,改变图像每当这首歌的变化。

this.autorun(function() { 
    if(this.subscriptionsReady()){ 
     var currentSong = Playlist.findOne({'position': 0}); 
     if(currentSong){ 
      var thumbnail = currentSong.thumbnail.getFileRecord(); 
      $('#thumbnail').attr('src', thumbnail.url()); 
     } 
    } 
}.bind(this)); 

它可能不是理想的解决方案,但它的工作原理。由于某种原因,subscriptionReady和CollectionFS似乎并没有很好地协同工作。