2016-08-02 65 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似乎並沒有很好地協同工作。