2013-08-09 10 views
6

Ta nowa wersja mojego starego question:Meteor: Jak wyzwalać powtórzenie funkcji pomocnika po collectionHandle.ready() jest prawdziwe

Więc dzięki pomocy Toma Colemana w końcu zorientowali się, w jaki sposób sprawdzić, czy prawidłowo subskrypcja jest gotowa() lub nie.

Moja obecna struktura kod wygląda następująco:

/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')); 
     }); 
}); 
// ... 

Wtedy muszę zobaczyć specyficzny .js i pliki .html dla wszystkich rzeczy szablonu w folderze o nazwie:

/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; 
     } 
} 

Ten helper dataLoaded zawija w zasadzie wszystko w odpowiednim szablonie i pokazuje zawartość, gdy dataLoaded zwraca wartość true, lub pokazuje obrót ładujący.

Problem polega na tym, że w wielu przypadkach nie działa to, ponieważ kod dataLoaded jest uruchamiany tylko raz. Jeśli więc oba uchwyty NIE są gotowe() w czasie, gdy uruchamiana jest dataLoaded, zawartość NIGDY nie pojawi się. W tym przypadku nadal widzę wszystkie pliki console.log pochodzące z pliku app.js (rzeczy Deps.autorun()), ale dziennik "Wszystkie dane załadowane!" nigdy nie jest echem.

Moje pytanie brzmi: Jak wywołać ponowne uruchomienie tego kodu, aby ponownie uruchomić dataLoaded, aby zawartość ostatecznie się wyświetliła?

pozdrawiam

+0

Gdzie prowadzisz aplikację? –

+0

na teraz localhost. Dlaczego pytasz? –

+0

Bo Heroku jest dla mnie trochę dziwaczny w Chrome. –

Odpowiedz

8

Problem może być rozwiązany jedynie poprzez stworzenie zależność:

var _dep = new Deps.Dependency(); 

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


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

Teraz, za każdym razem uruchomić _dep.changed() metody, pomocnik będzie powtórzona. Prosty!

+0

Dzięki za odpowiedź! Z jakiegoś powodu pomaga to, gdy wykonuję przeładowanie strony przez Cmd + L (przeskocz do paska adresu) + Enter. (tak jak ponowne wpisywanie tego samego URl i ładowanie). Ale jeśli wykonuję przeładowanie za pomocą Cmd + R, otrzymuję błędy takie jak ten: http://cl.ly/image/2C2p0Y1F030Y –

+0

Miałeś to lepiej wcześniej: 'if (eventsHandle && groupsHandle && EventsHandle.ready () && groupsHandle.ready()) '. –

+0

Dlaczego standardowe opiekunowie nie mogą się tym zająć? Czy to nie dlatego je mamy? –

0

Aby wywołać metodę eventHandleready() trzeba nawiasy inaczej myślę, że jesteś po prostu sprawdzenie, czy metoda gotowy istnieje. Dyskusja na ten temat to here.

Prawdopodobnie nadal pozostawi to problem z ustawieniem eventHandle dla różnych uchwytów subskrypcji w różnych częściach skryptu javascript. Spróbuj uporządkować pliki swojej aplikacji zgodnie z opisem podanym pod numerem here.

+0

Dzięki za wyjaśnienie nawiasów! O strukturze: Próbowałem umieścić wszystkie moje subskrypcje w JEDNO Deps.autorun() dla całego projektu meteorytów (to masz na myśli, prawda ?!). Problem polega na tym, że nie mam dostępu do uchwytów, a następnie w moim widoku konkretnych plików .js (-> 'client/views/

0

To wygląda na bardziej skomplikowane, niż powinno być. Prawdopodobnie czegoś brakuje, ale wydaje mi się, że próbujesz ustawić spinner ładujący po załadowaniu danych. Wysłałem prosty, bardziej czytelny sposób na showing "loading" in Meteor.

+0

Próbowałem już tego podejścia, ale z jakiegoś powodu nie działał poprawnie. Może zrobiłem coś złego, spróbuję ponownie jutro! Powiadomię Cię! :) –

Powiązane problemy