2014-10-09 13 views
9

Jestem zmuszony do przypisania odwzorowanych wywołań zwrotnych do wszystkich moich szablonów.Oddzwoń do wszystkich szablonów w blasku meteoru

Do 0.9.0 kiedyś zrobić to tak:

_.each(Template, function(template, name) { 
    //... 
    template.rendered = function() { 
    //... 
    }; 
}); 

Ale teraz, Szablon jest konstruktorem a nie przedmiotem, więc ta metoda nie zadziała tutaj. Czy istnieje sposób przekazywania funkcji wywołania zwrotnego do wszystkich szablonów lub funkcji fire, gdy wszystkie szablony zostały wyrenderowane za pomocą Blaze?

Odpowiedz

9

Oto krótkie rozwiązanie, które wymyśliłem, powtarzanie każdej właściwości Template w celu sprawdzenia, czy odpowiada ona definicji szablonu, a jeśli tak, przypisanie połączenia zwrotnego onRendered.

// make sure this code is executed after all your templates have been defined 
Meteor.startup(function(){ 
    for(var property in Template){ 
    // check if the property is actually a blaze template 
    if(Blaze.isTemplate(Template[property])){ 
     var template=Template[property]; 
     // assign the template an onRendered callback who simply prints the view name 
     template.onRendered(function(){ 
     console.log(this.view.name); 
     }); 
    } 
    } 
}); 

Nie wiem, jaki jest twój przypadek użycia, więc mogą istnieć lepsze rozwiązania w zależności od tego.

+1

Właściwie to jest to, czego potrzebuję, ale jakikolwiek pomysł gdzie umieścić ten kod tak, by ładował się po zdefiniowaniu wszystkich szablonów? Zamiast sprawdzania 'Template [property] .viewName' można użyć funkcji Blaze.isTemplate –

+1

Dzięki za sugestię' Blaze.isTemplate', zaktualizowałem swój kod, aby użyć strony 'Meteor.startup' po stronie klienta, aby upewnić się, że jest wykonywane po zdefiniowaniu wszystkich szablonów. – saimeunt

+0

Działa jak urok! Wielkie dzięki! –

-4

W Meteor 1.2.1 obiekt Template ma funkcję onRendered (hook), która umożliwia zachowanie "całego szablonu".

Template.onRendered(function(){ 
    var template = this; 
    Deps.afterFlush(function() { 
    console.log("triggering Jquery mobile component creation for "+template.view.name); 
    $(template.firstNode.parentElement).trigger("create"); 
    }); 
}); 

Odłożona aktualizacja za pośrednictwem Deps.afterFlush (wywołanie zwrotne) jest opcjonalna i zależy od potrzeb aplikacji.

+2

Jestem na meteor 1.2.1, ale to rozwiązanie nie działa: 'TypeError: Template.onRendered nie jest funkcją' –

+0

Nie wiem, dlaczego to nie działało dla Ciebie i najwyraźniej innych, którzy głosowali za odpowiedzią, ale to funkcja działa zgodnie z oczekiwaniami w kilku aplikacjach produkcyjnych. Sprawdź [kod źródłowy] (https://github.com/meteor/blaze/commit/1d175814f1d9ad857743601f55073395dbdfedad) i, jeśli to możliwe, potwierdź, że obiekt Template jest w rzeczywistości obiektem szablonu Meteor Blaze, a nie został zastąpiony/zmutowany ... – user1756588

+0

Właśnie sprawdzono Meteor 1.4 i 'Template.onRendered' są" niezdefiniowane ". –

Powiązane problemy