2013-08-09 5 views
6

Dies ist eine neue Version meiner alten question:Meteor: Wie Rerun von Helferfunktion nach collectionHandle.ready auszulösen() wahr ist

So dank Tom Coleman Hilfe ich endlich herausgefunden, wie man richtig, wenn ein prüfen, Abonnement ist bereit() oder nicht.

Meine aktuellen Code-Struktur sieht wie folgt aus:

/client/app.js: 

eventsHandle = null; 
groupsHandle = null; 
// ... 
// First Deps.autorun(): 
// Does not depend on any Session var, should just run every time 
Deps.autorun(function() { 
    eventsHandle = Meteor.subscribe("events", function() { 
     console.log('Deps.autorun(): Events loaded'); 
    }); 
}); 

// Second Deps.autorun(): 
// contains all subscriptions which are dependent on my Session var "ehash" 
Deps.autorun(function() { 
    if(Session.get('ehash')) 
     groupsHandle = Meteor.subscribe("groups", Session.get('ehash'), function() { 
      console.log('Deps.autorun(): Groups loaded with ehash: ' + Session.get('ehash')); 
     }); 
}); 
// ... 

Dann habe ich Ansicht spezifische Js und .html-Dateien für die ganze Vorlage Sachen in einem Ordner namens:

/client/views/ 
--> <page>.js: 

Template.x.dataLoaded = function() { 
    if(Session.get('ehash')) 
     if(eventsHandle && groupsHandle && eventsHandle.ready() && groupsHandle.ready()) { 
      console.log('All data loaded!'); 
      singleevent = Events.find({ehash: Session.get('ehash')}).fetch()[0]; 
      return true; 
     } 
} 

Dieser Helfer dataLoaded wickelt im Prinzip alles in die entsprechende Vorlage ein und zeigt den Inhalt, wenn dataLoaded den Wert true zurückgibt oder einen Lade-Spinner zeigt.

Problem ist, dass dies in vielen Fällen nicht funktioniert, da dieser DataLoaded-Code nur einmal ausgeführt wird. Wenn also die beiden Handles zum Zeitpunkt der Ausführung von dataLoaded NICHT bereit() sind, wird der Inhalt NIEMALS angezeigt. In diesem Fall sehe ich immer noch alle console.logs aus der Datei app.js (die Deps.autorun() Sachen), aber das Protokoll "Alle Daten geladen!" ist nie echod.

Also meine Frage ist: Wie trigger ich eine Wiederholung dieses Codes, so dataLoaded wird wieder ausgeführt, so dass Inhalte schließlich angezeigt werden?

freundlichen Grüßen

+0

Wo hosten Sie die App? –

+0

für jetzt localhost. Warum fragst du? –

+0

Weil Heroku in Chrome für mich etwas komisch war. –

Antwort

8

Das Problem kann einfach gelöst werden, indem eine Abhängigkeit zu schaffen:

var _dep = new Deps.Dependency(); 

Template.x.dataLoaded = function() { 
    _dep.depend(); 
    ... 
} 


function handler() { 
    ... do.stuff(); 
    _dep.changed(); 
} 

nun jedes Mal, wenn _dep.changed() Methode ausführen, wird erneut aus dem Helfer. Einfach!

+0

Danke für deine Antwort! Aus irgendeinem Grund hilft dies, wenn ich eine Seite über Cmd + L neu lade (springe in URL-Leiste) + Enter. (so, als würde man die gleiche URl erneut eingeben und laden). Aber wenn ich ein Reload über Cmd + R mache, bekomme ich Fehler wie diese: http://cl.ly/image/2C2p0Y1F030Y –

+0

Sie hatten es schon besser: 'if (eventsHandle && groupsHandle && eventsHandle.ready () && groupsHandle.ready()) '. –

+0

Warum können die Standardhandler das nicht tun? Haben wir sie deshalb nicht? –

0

die ready() Methode von eventHandle So rufen Sie die Klammern sonst muss ich glaube, Sie überprüft nur, dass die bereit Methode existiert. Diskussion hierzu ist here.

Dies wird wahrscheinlich immer noch mit einem Problem, wenn eventHandle auf verschiedene Subskriptions-Handles in verschiedenen Teilen Ihres Javascript gesetzt wird. Versuchen Sie, die Dateien Ihrer App wie beschrieben zu strukturieren here.

+0

Vielen Dank, dass Sie das Klammern-Ding klar gemacht haben! Über die Struktur: Ich habe versucht, alle meine Abonnements in ONE Deps.autorun() für das ganze Meteor-Projekt (das ist, was Sie meinen, richtig ?!). Problem ist, dass ich auf die Handles dann in meiner Ansicht spezifische .js-Dateien (-> 'client/views/

0

Das sieht komplizierter aus als es sein muss. Ich vermisse sehr wahrscheinlich etwas, aber es scheint mir, dass Sie nur versuchen, ein Lade-Spinner zu setzen, wenn Daten geladen werden. Ich habe einen einfachen, leserlicheren Weg von showing "loading" in Meteor gepostet.

+0

Nun, ich habe diesen Ansatz schon versucht, aber aus irgendeinem Grund würde es nicht richtig funktionieren. Vielleicht habe ich etwas falsch gemacht, werde es morgen nochmal versuchen! Ich werde euch auf dem Laufenden halten! :) –