2012-05-04 26 views
22

Ta wyjątkowo prosta aplikacja Meteor wyrzuca błąd o wartości Template is not defined. Aplikacja jest zasadniczo identyczna z projektem standardowym (meteor create), podzielonym na katalogi serwer/klient/publiczny.Co powoduje, że "Szablon nie jest zdefiniowany" w Meteorze?

Wydaje się, że Meteor próbuje renderować tagi Handlebars template, zanim globalny obiekt Template będzie gotowy. Zanim przejdę do konsoli JS i napiszę "Szablon", już jest.

Czy zrobiłem coś nie tak, czy to błąd czasu?

+0

Gdzie znajduje się ten szablon do użytku? Wygląda na to, że próbujesz dołączyć szablon przed pierwszym załadowaniem meteor.js – dwerner

+0

Meteor obsługuje łączenie i uwzględnianie wszystkich plików js w projekcie, więc nie można dołączyć szablonu przed meteor.js.Jeśli dobrze cię rozumiem. Tak czy inaczej, wybrana odpowiedź pokazuje, na czym polegał problem. – mwcz

+1

Mam ten problem, kiedy zmieniłem 'UI.registerHelper' na nowy' Template.registerHelper'. Musi się zdarzyć, że wycofany "UI" był zdefiniowany zarówno dla serwera, jak i klienta, ale "Szablon" jest zdefiniowany tylko dla klienta. –

Odpowiedz

9

Hm, może to rozwiąże problem:

Zauważ, że znacznik korpus zawiera nazwę szablonu, ale nie szablon:

<body> 
    {{> hello}} 
</body> 

<template name="hello"> 
    {{greet}} 
</template> 

Należy również pamiętać, że ".greet" odnosi się do {{ Pozdrawiam}}:

if (Meteor.isClient) { 
    Template.hello.greet = function() { 
    return "Hey!"; 
    }; 
} 

Problem polegał na tym, że nie można mieć szablonu wewnątrz ciała. Zamiast tego ciało odwołuje się do szablonu za pomocą {{> hello}}, tak jak w powyższym kodzie.

+4

To jest teraz 'Meteor.isClient', a nie' is_client' –

+0

dzięki temu, że działa dla mnie. –

0

Spróbuj Template.hello.this przekazać dane do {{to}}

27

Musisz upewnić się w pliku .js który wywołuje Szablon jest owinięty w if (Meteor.isClient){}, inaczej Template globalny var won” być dostępne z jakiegoś powodu.

+2

Dlaczego to zachowanie? Czy potrzebuję tej sztuczki, nawet jeśli używam różnych folderów klient/serwer? – Hamal000

+0

Byłem w tej samej pozycji oddzielne foldery dla klienta i serwera. Po tym, błąd zniknął. Ale nie jestem w 100% pewien, czy jest to odpowiednie rozwiązanie. Nie powinieneś tego robić. Może mój serwer meteorów umarł i nie zdawałem sobie sprawy, że pamięć podręczna przeglądarki jest w pamięci i wygląda na to, że aplikacja wciąż działa. – KJW

+0

Tak mi się stało, zapomniałem dodać '," client "' in' api.addFiles() 'w' pakiet.js'. –

0

To jest problem z inicjalizacją. Używam Meteor 1.0 i rozwiązałem problem przez dodanie bloku Meteor.startup(function() {} lub if do Meteor.isClient.

To może być błąd, ponieważ dokumentacja na specjalnych katalogach mówi jak poniżej (na dzień dzisiejszy):

Klienta: Każdy katalog o nazwie klient nie jest załadowany na serwerze. Podobne do zawijania twojego kodu, jeśli (Meteor.isClient) {...}. Wszystkie pliki załadowane na kliencie są automatycznie łączone i minimalizowane w trybie produkcyjnym. W trybie programowania każdy plik jest wysyłany indywidualnie, co ułatwia debugowanie. Pliki HTML w aplikacji Meteor są traktowane całkiem inaczej niż po stronie serwera. Meteor skanuje wszystkie pliki HTML w twoim katalogu dla trzech elementów najwyższego poziomu: <head>, <body> i <template>. Sekcje głowy i ciała są oddzielnie łączone w jedną głowę i ciało, które są przesyłane do klienta po wczytaniu strony początkowej.

Ale bez inicjalizacji nie powiedzie się to z błędem "Błąd szablonu".

5

Jeśli w opakowaniu upewnij się templating liście API, czyli

api.use ('szablonów', 'klient');

To zapewnia, że ​​kod zostanie uruchomiony po utworzeniu obiektu Template.

+0

powinien być zaakceptowany odpowiedź – ZuzEL

Powiązane problemy