我已經搜索並嘗試了幾個小時,但我無法爲此提出任何解決方案。流星訂閱已準備好不起作用
我正在寫一個音樂應用程序,可以在服務器上播放來自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及其功能。我在另一個項目中使用過它。但這個應用程序是唯一的一個頁面應用程序,根本不需要路由。所以我想限制使用它。
您可能需要展示更多代碼才能找到問題。具體來說,你如何從一個數組中的兩個不同的遊標(相當奇怪的...)發佈到this.thumbnail –
我已經編輯了這個問題來給你更多的代碼。我希望這有幫助。出版物的哪一部分你覺得很奇怪?什麼是適當的方式來做到這一點? – JHolub
您是否在控制檯中發現任何錯誤?有時在這些情況下,我發現客戶端由於錯誤而導致停止處理,因爲變量未定義 - 例如this.thumbnail可能未定義getFileRecord()被調用的位置 –