EDYCJA: Ta odpowiedź jest stara i nieaktualna. Skasowałbym ją, ale jest to odpowiedź „zaakceptowana”. Zamiast tego wstrzyknę swoją opinię.
Nie polecałbym już tego robić. Zamiast tego rozdzieliłbym wszystkie szablony na pojedyncze pliki HTML. Niektórzy sugerowaliby ładowanie ich asynchronicznie (Require.js lub pewnego rodzaju pamięć podręczna szablonów). To działa dobrze w małych projektach, ale w dużych projektach z dużą ilością szablonów, przy ładowaniu strony tworzysz mnóstwo małych żądań asynchronicznych, których naprawdę nie lubię. (ugh ... ok, możesz to obejść z Require.js, wstępnie kompilując swoje początkowe zależności z r.js, ale w przypadku szablonów nadal wydaje mi się to niewłaściwe)
Lubię używać gruntownego zadania (grunt-contrib-jst), aby skompilować wszystkie szablony HTML w jednym pliku templates.js i dołączyć go. Dostajesz to, co najlepsze ze wszystkich światów IMO ... szablony żyją w pliku, kompilacja wspomnianych szablonów odbywa się w czasie kompilacji (nie w czasie wykonywania) i nie masz stu małych żądań asynchronicznych podczas uruchamiania strony.
Wszystko poniżej to śmieci
Dla mnie wolę prostotę dołączania pliku JS do mojego szablonu. Mogę więc utworzyć plik o nazwie view_template.js, który zawiera szablon jako zmienną:
app.templates.view = " \
<h3>something code</h3> \
";
Następnie jest to tak proste, jak włączenie pliku skryptu jak normalny, a następnie użycie go w widoku:
template: _.template(app.templates.view)
Idąc krok dalej, właściwie używam coffeescript, więc mój kod w rzeczywistości wygląda bardziej tak i unikam znaków ucieczki końca linii:
app.templates.view = '''
<h3>something code</h3>
'''
Takie podejście pozwala uniknąć zalewania w require.js, gdzie naprawdę nie jest to konieczne.
Oto proste rozwiązanie:
Używanie „async: false” tutaj nie jest złym sposobem, ponieważ w każdym przypadku musisz poczekać, aż szablon zostanie załadowany.
Zatem funkcja „renderuj”
[Edytuję odpowiedź zamiast zostawiać komentarz, ponieważ uważam, że jest to ważne.]
jeśli szablony nie wyświetlają się w aplikacji natywnej , a widzisz
HIERARCHY_REQUEST_ERROR: DOM Exception 3
, spójrz na odpowiedź Dave'a Robinsona na pytanie Co dokładnie może spowodować błąd „HIERARCHY_REQUEST_ERR: DOM Exception 3” -Error? .Zasadniczo musisz dodać
do żądania $ .ajax.
źródło
dataType: 'html'
do naszego żądania Ajax , na wszelki wypadek?Ten wstawek pozwala na renderowanie szablonu zewnętrznych przy użyciu Underscore w bardzo prosty sposób:
_.templateFromUrl(url, [data], [settings])
. API metody jest prawie takie samo, jak _.template () podkreślenia . Zawiera buforowanie.Stosowanie:
źródło
Nie chciałem używać require.js do tego prostego zadania, więc użyłem zmodyfikowanego rozwiązania koorchika.
Po co dołączać szablony do dokumentu, zamiast przechowywać je w obiekcie javascript? Ponieważ w wersji produkcyjnej chciałbym wygenerować plik html ze wszystkimi szablonami już zawartymi, więc nie będę musiał wykonywać żadnych dodatkowych żądań Ajax. W tym samym czasie nie będę musiał dokonywać żadnych refaktoryzacji w moim kodzie, jak używam
w moich widokach Backbone.
źródło
async: false
jest teraz przestarzałaasync: false
jest przestarzały, poprawiłem odpowiedź, dodająccomplete
wywołanie zwrotne.To może być trochę nie na temat, ale możesz użyć Grunt (http://gruntjs.com/) - który działa na node.js (http://nodejs.org/, dostępny dla wszystkich głównych platform) do uruchamiania zadań z wiersz poleceń. Istnieje kilka wtyczek do tego narzędzia, takich jak kompilator szablonów, https://npmjs.org/package/grunt-contrib-jst . Zobacz dokumentację na GitHub, https://github.com/gruntjs/grunt-contrib-jst . (Musisz również zrozumieć, jak uruchomić menedżera pakietów węzłów, https://npmjs.org/ . Nie martw się, jest to niezwykle łatwe i wszechstronne).
Następnie możesz przechowywać wszystkie szablony w osobnych plikach html, uruchomić narzędzie, aby wstępnie skompilować je wszystkie za pomocą podkreślenia (co moim zdaniem jest zależne od wtyczki JST, ale nie martw się, menedżer pakietów węzłów automatycznie zainstaluje zależności).
Powiedzmy, że kompiluje to wszystkie szablony do jednego skryptu
Wczytanie skryptu domyślnie ustawi globalny - „JST” - który jest tablicą funkcji, do których można uzyskać dostęp w następujący sposób:
JST['templates/listView.html']()
który byłby podobny do
jeśli umieścisz zawartość tego tagu skryptu w (templates /) listView.html
Jednak prawdziwy kicker jest następujący: Grunt zawiera zadanie zwane „obserwacją”, które w zasadzie będzie monitorować zmiany w plikach, które zdefiniowałeś w lokalnym pliku grunt.js (który jest w zasadzie plikiem konfiguracyjnym dla twojego projektu Grunt, w javascript ). Jeśli masz chrząknięcie, rozpocznij to zadanie za siebie, wpisując:
z wiersza poleceń Grunt będzie monitorował wszystkie zmiany, które wprowadzasz w plikach i automatycznie wykona wszystkie zadania, które ustawiłeś dla niego w tym pliku grunt.js, jeśli wykryje zmiany - tak jak zadanie jst opisane powyżej. Edytuj, a następnie zapisz swoje pliki, a wszystkie szablony zostaną ponownie skompilowane w jednym pliku js, nawet jeśli są rozmieszczone w wielu katalogach i podkatalogach.
Podobne zadania można skonfigurować do lintowania javascript, uruchamiania testów, konkatenacji i minifikacji / uglifowania plików skryptów. A wszystko to można powiązać z zadaniem podglądu, więc zmiany w plikach automatycznie uruchomią nową „kompilację” projektu.
Skonfigurowanie rzeczy i zrozumienie, jak skonfigurować plik grunt.js, zajmuje trochę czasu, ale jest to warte zainwestowanego czasu i nie sądzę, abyś kiedykolwiek wrócił do sposobu pracy sprzed pracy
źródło
template: JST['test.html']()
wydaje się, że nie ładuje danych z JST :( (zobacz moje pytanie tutaj: stackoverflow.com/questions/29723392/ ... )Myślę, że to może ci pomóc. Wszystko w rozwiązaniu kręci się wokół
require.js
biblioteki, która jest plikiem JavaScript i modułem ładującym.Samouczek pod powyższym linkiem bardzo ładnie pokazuje, jak można zorganizować projekt szkieletowy. Dostarczono również przykładową implementację . Mam nadzieję że to pomoże.
źródło
Zainteresowałem się szablonami javascript i teraz stawiam pierwsze kroki z kręgosłupem. To właśnie wymyśliłem i wydaje się, że działa całkiem nieźle.
źródło
get
funkcji prawdopodobnie zwróciłbym$.ajax
samą siebie, więc zwraca obiekt obietnicy, więc na wypadek, gdyby twój szablon nie odpowiedział od razu.Musiałem ustawić typ danych na „tekst”, aby działał dla mnie:
źródło
Znalazłem rozwiązanie, które działa dla mnie z wykorzystaniem jQuery.
Dodaję kod szablonu podkreślenia, za pomocą metody jQuery.load (), do głównego pliku html.
Gdy już tam jest, używam go do generowania szablonów. Wszystko musi się odbywać synchronicznie!
Koncepcja jest taka:
Mam podkreślony kod szablonu mapy:
Umieściłem ten kod w pliku o nazwie map-template.html
Następnie tworzę opakowanie dla plików szablonów.
Następnie dołączam ten plik do mojego głównego pliku HTML.
W głowie:
Twoje zdrowie.
źródło
Wiem, że to pytanie jest naprawdę stare, ale pojawiło się jako pierwszy wynik w wyszukiwarce Google dla szablonów Ajax podkreślenia.
Byłem zmęczony nie znajdowaniem dobrego rozwiązania, więc stworzyłem własne:
https://github.com/ziad-saab/underscore-async-templates
Oprócz wczytywania szablonów podkreślenia za pomocą AJAX, dodaje funkcję <% include%>. Mam nadzieję, że komuś się przyda.
źródło
Byłem trochę niespokojny, zmuszając jQuery do synchronicznego działania, więc zmodyfikowałem poprzedni przykład synchroniczny, używając obietnic. To prawie to samo, ale działa asynchronicznie. W tym przykładzie używam szablonów HBS:
Następnie użyj wyrenderowanego html:
UWAGA: Jak omówiono przez innych, lepiej byłoby skompilować wszystkie szablony w jednym pliku templates.js i załadować go na początku, zamiast wykonywać wiele małych synchronicznych wywołań AJAX, aby uzyskać szablony podczas ładowania strony internetowej.
źródło
Ostrzeżenie do przodu - oto smoki:
Wspominam o podejściu pokazanym poniżej, aby pomóc tym, którzy walczą o to, aby stosy ASP.NET (i podobne frameworki) działały harmonijnie z ekosystemem js-libs. Nie ulega wątpliwości, że nie jest to ogólne rozwiązanie. Powiedziawszy to ...
/ endforwardwarning
Jeśli używasz ASP.NET, możesz udostępnić szablony na zewnątrz, po prostu umieszczając je w jednym lub kilku własnych widokach częściowych. Aka wewnątrz twojego .cshtml:
Wewnątrz pliku template.cshtml:
A teraz możesz użyć szablonu jak zwykle:
Mam nadzieję, że to nieuchwytne i oczywiste podejście pomoże komuś zaoszczędzić godzinę na drapaniu się po głowie.
źródło