Javascript Meteor订阅准备就绪,无法工作
我已经搜索和尝试了几个小时,但我找不出任何解决办法 我正在编写一个音乐应用程序,在服务器上播放YouTube上的歌曲。我正在下载缩略图并将其存储在一个文件夹中(因为我以后需要它的高斯模糊版本) 我的发布方法如下所示:Javascript Meteor订阅准备就绪,无法工作,javascript,meteor,Javascript,Meteor,我已经搜索和尝试了几个小时,但我找不出任何解决办法 我正在编写一个音乐应用程序,在服务器上播放YouTube上的歌曲。我正在下载缩略图并将其存储在一个文件夹中(因为我以后需要它的高斯模糊版本) 我的发布方法如下所示: Meteor.publish('currentSong', function() { return [Playlist.find({'position': 0}), Thumbnails.find()]; }); 我有一个版本只发布了当前歌曲的缩略图,但这导致了更多的问题
Meteor.publish('currentSong', function() {
return [Playlist.find({'position': 0}), Thumbnails.find()];
});
我有一个版本只发布了当前歌曲的缩略图,但这导致了更多的问题
在我的TemplatesOnCreated方法中,我订阅了它(以及其他各种东西)。我在this.autorun()
方法内部和外部都尝试过
Template.controlpanel.onCreated(function() {
// subscribe to the publications
Meteor.subscribe('currentSong');
Meteor.subscribe('status');
});
然后,我有一个模板帮助器,它检索缩略图的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}}
在这里您可以看到,this.thumbnail
在{{with currentSong}}}
的上下文中是指存储缩略图及其高斯模糊版本的FS.File对象
问题是,当模板已经加载并且正在从一首歌曲切换到另一首歌曲时,它可以正常工作。但是当我的播放列表中没有歌曲时,显示部分是不可见的(从技术上讲,模板是渲染的,但所有信息都在{with currentSong}
块中)。当我插入一首歌曲时,屏幕会“弹出”,除缩略图外,所有内容都会显示出来(歌曲标题、持续时间滑块等)。一旦我重新加载页面,它就会出现
我正在订阅收藏。我检查订阅是否已准备就绪,但它仍然不起作用
我的应用程序中还有一些其他部分,我在一个onCreated上下文中订阅,但仍然必须使用setTimeout(function(),100)
,因为否则数据还不可用
我很确定问题就在屏幕前,我遗漏了一些东西,或者不完全理解Meteor的订阅,以及哪部分是反应性的或不是。但我就是不明白。如果你能帮我,我将不胜感激
需要注意的一点是,我知道它的功能。我在我的另一个项目中使用过它。但是这个应用程序是唯一一个完全不需要路由的单页应用程序。所以我想限制使用它。所以在玩了一点之后,问题基本上是,订阅已经准备好了,但是收集nFS文件不可用 现在,我的解决方案是,让我的助手以反应式的方式设置正确的URL,除了第一次呈现模板外,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似乎不能很好地协同工作。您可能需要为我们展示更多的代码来发现问题。特别是您如何从将两个不同的游标以数组形式发布到此。Thumbnail我已编辑了问题,以便为您提供更多代码。我希望这会有所帮助。您认为发布的哪一部分很奇怪?正确的方法是什么?您在控制台中是否遇到任何错误?有时,在这些情况下,我发现客户端由于e而停止处理错误,因为变量未定义-例如,在调用getFileRecord()时,this.缩略图可能未定义。我刚刚再次检查,没有,我没有看到任何错误消息。但我尝试将
console.log(thumbnail.url({'store':'thumnail'}))
放在帮助程序中,当我输入第一首歌曲时(这会导致模板“出现”),第一条消息为我提供了正确的URL,但随后我看到了连续的消息,声明由同一个助手产生的null
。这似乎很奇怪。因此我实际上找到了一个我根本不喜欢的黑客解决方案。使用一些console.log()
语句我发现,在某个点上,助手实际上找到了缩略图,但是缩略图.url()
返回空值的值不小于空值。但是如果我将此返回缩略图.url()
放在setTimeout(函数(){…},100)中
阻止它工作。所以我的问题是,为什么会有类似于subscriptionsReady()
的东西,而最终,订阅还没有准备好。这个函数甚至在数据找不到的情况下返回true。这将是我在这个项目中第三次不得不使用setTimeout
hack。
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));