2016-08-02 6 views
2

Ich habe gesucht und versucht für Stunden, aber ich konnte keine Lösung für diese.Meteor Abonnements bereit nicht funktioniert

Ich schreibe eine Musik-Anwendungen, die Lieder von YouTube auf einem Server spielt. Ich lade das Thumbnail herunter und speichere es in einem cfs:collection (weil ich später eine gaußsche Unschärfe-Version davon brauche).

Mein veröffentlichen Methode sieht wie folgt aus:

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

ich eine Fassung, für die nur das Miniaturbild des aktuellen Songs veröffentlicht, aber das verursacht noch mehr Probleme.

In meiner Templates onCreated-Methode abonniere ich diese (unter anderem). Ich habe beide innerhalb einer this.autorun() Methode und außerhalb von einem versucht.

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

Und dann habe ich eine Vorlage Helfer die URL der Miniatur Abrufen es tatsächlich angezeigt werden innerhalb eines <img src="<url>" /> Kontext:

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

Da ich für etwas mehr Code gefragt, hier ist ein Ausschnitt aus die tatsächliche Vorlage

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

Wo Current nur ein Datenbankeintrag zurückgibt, dem folgenden Schema hören:

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" 
    } 
}); 

Hier können Sie sehen, dass this.thumbnail im Rahmen der {{#with currentSong}} bezieht sich auf ein fs.file Objekt sowohl das Thumbnail und seine Gaußsche Unschärfe Version zu speichern.

Das Problem ist, dass, wenn das Template bereits geladen ist und es von einem Song zum anderen wechselt, es ohne Probleme funktioniert. Wenn jedoch kein Titel in meiner Wiedergabeliste vorhanden ist, ist der Anzeigeteil unsichtbar (Die Vorlage wird technisch gerendert, aber alle Informationen befinden sich in einem {{#with currentSong}} Block). Und wenn ich einen Song einfüge, erscheint die Anzeige "Pop Up" und alles wird angezeigt (Songtitel, Dauerregler usw.), mit Ausnahme des Thumbnails. Sobald ich die Seite neu geladen habe, ist sie da.

Ich abonniere die Sammlung. Ich überprüfe, ob die Abonnements fertig sind oder noch nicht funktioniert.

Ich habe einige andere Teile in meiner Anwendung, wo ich in einem onCreated-Kontext subscribe, und immer noch setTimeout (function(), 100) verwenden, weil sonst die Daten noch nicht verfügbar sind.

Ich bin mir ziemlich sicher, dass das Problem vor dem Bildschirm liegt, dass ich etwas vermisse oder Meteor's Abonnements nicht verstehe und welcher Teil reaktiv ist oder nicht. Aber ich verstehe es einfach nicht. Sie helfen würden sehr geschätzt.

Eine Sache zu beachten ist, dass ich iron-router und seine Fähigkeiten kenne. Ich habe es in einem anderen Projekt von mir verwendet. Aber diese App ist eine einzige Seite Anwendungen, die überhaupt keine Routen benötigen. Daher möchte ich davon absehen, es zu benutzen.

+0

Sie müssen wahrscheinlich ein bisschen mehr Code zeigen, damit wir das Problem finden. Genauer gesagt, wie Sie von der (eher seltsamen ...) Veröffentlichung von zwei verschiedenen Cursorn in einem Array dazu kommen. –

+0

Ich habe die Frage bearbeitet, um Ihnen noch mehr Code zu geben. Ich hoffe das hilft. Welchen Teil der Publikation findest du seltsam? Und was wäre ein richtiger Weg, es zu tun? – JHolub

+0

Erhalten Sie irgendwelche Fehler in der Konsole? Manchmal finde ich in diesen Fällen, dass der Client die Verarbeitung aufgrund von Fehlern beendet hat, weil eine Variable nicht definiert ist - z. this.thumbnail könnte zu dem Zeitpunkt undefiniert sein, an dem getFileRecord() –

Antwort

1

Also nach etwas mehr spielen das Problem im Grunde ist, dass die Abonnements bereit sind, aber die CollectionFS-Dateien sind nicht.

Meine Lösung war jetzt, dass ich meinen Helfer habe, reaktiv die korrekte URL einstellend, die immer funktioniert, außer wenn das Template zuerst gerendert wird.

Um dieses Problem anzugehen Ich habe eine Autorun-Funktion, die das Bild ändert, wenn der Song wechselt.

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)); 

Es ist wahrscheinlich nicht die ideale Lösung, aber es funktioniert. Aus irgendeinem Grund scheinen subscriptionReady und CollectionFS nicht sehr gut zusammen zu arbeiten.

Verwandte Themen