我已经搜索并尝试了几个小时,但我无法为此找到任何解决方案。
我正在编写一个音乐应用程序,可以在服务器上播放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"
}
});
在这里你可以看到,this.thumbnail
上下文中的{{#with currentSong}}
指的是存储缩略图及其高斯模糊版本的FS.File对象。
问题是,当模板已经加载并且它正在从一首歌切换到另一首歌时,它可以正常工作。但是当我的播放列表中没有歌曲时,显示部分是不可见的(模板在技术上是渲染的,但所有信息都在{{#with currentSong}}
块内)。当我插入一首歌曲时,显示“弹出”并显示所有内容(歌曲标题,持续时间滑块等),缩略图除外。一旦我重新加载页面,它就在那里。
我订阅了这个系列。我查看天气订阅准备好了,但仍然无法正常工作。
我的应用程序中有一些其他部分,我在onCreated上下文中订阅,但仍然必须使用setTimeout (function(), 100)
,否则数据尚不可用。
我很确定问题出现在屏幕前,我遗漏了一些东西或者没有完全理解Meteor的订阅以及哪部分是被动的。但我只是不明白。非常感谢你的帮助。
需要注意的一点是,我了解iron-router及其功能。我在我的另一个项目中使用过它。但是这个应用程序是一个单页应用程序,根本不需要路由。所以我想限制使用它。