2013-05-14 10 views
32

Chcę utworzyć aplikację w Meteor, z tego, co rozumiem w podręczniku, który po raz pierwszy ładuje, które są w podkatalogach , a następnie następuje w kolejności alfabetycznej. Moja struktura plików jest tak ...funkcje wywołania z oddzielnych plików z Meteorem

/server 
/lib 
/client 
    /lib 
     game.js -> already starts declaring the function "makeBoard(){}" 
    /template.js -> where the function "makeBoard()" is called. 

wydaje się więc, że funkcja błędu „makeBoard()” nie istnieje, działa tylko jeśli oświadczam w tym samym pliku, gdzie chcesz to nazwać. Nawet gdy przeniesię plik "game.js" do tego samego katalogu, gdzie "template.js", to się dzieje. Jak powinienem poprawnie tworzyć odniesienia do zasobów znajdujących się w różnych plikach na Meteor?

Odpowiedz

46

Określ funkcję za pomocą makeBoard = function() { ... }.

Funkcje zdefiniowane jako function foo() { ... } są lokalne dla pliku, podobnie jak zmienne zdefiniowane w var bar = ....

+0

Naprawiono problem, dziękuję. – Andy

+0

Z wersją EMCA6, a konkretnie ze znacznikiem '' use strict "' dla kodu javascript, to rozwiązanie nie jest kompilowane. Z tego powodu zdecydowanie sugeruję rozwiązanie @Shwaydogg. – nchinda2

+0

Działa to tylko na STRONĘ KLIENTA. Zobacz odpowiedź Shwaydogga na naprawę boczną SERWERA za pomocą Meteor.MyFunction.Method() – Andy

52

Używanie globalnie zdefiniowanej zmiennej, jak sugeruje avital, zadziała, ale nie jest zalecanym wyborem projektu kodu (see JS mistake 1 listed here).

Zamiast w katalogu lib można utworzyć plik z:

Meteor.myFunctions = { 
... 
    makeBoard : function() { ... }, 
... 
} 

Następnie w pliku jakikolwiek inny js można nazwać Meteor.myFunctions.makeBoard(). Należy to zrobić w katalogu lib, ponieważ Meteor gwarantuje, że pliki js w lib zostaną załadowane przed innymi katalogami, więc twoja funkcja będzie już załadowana.

+3

Bardzo sprytny. Jeśli udostępniasz funkcje z wielu plików, umożliwi to: Meteor ['myFunctions'] = Meteor ['myFunctions'] || {}; Meteor ['myFunctions'] ['createinstanceclass'] = function() { return new instanceclass(); } Meteor ['myFunctions'] = Meteor ['myFunctions'] || {}; Meteor ['myFunctions'] ['createsolutionclass'] = function() { return new solutionClass(); } Jeśli się zgadzasz, dodaj to do swojej odpowiedzi; jeśli nie, proszę wyjaśnić, jak to zrobić lepiej :) –

+0

DZIĘKUJEMY. W końcu otrzymałem kilka niestandardowych kodów po stronie serwera. Próbowałem uruchomić to na kliencie, i to NIE DZIAŁA, zgodnie z oczekiwaniami. Fantastyczny. – Andy

+0

dziękuję, pomaga – jremi