EDIT: Jawaban ini sudah tua dan ketinggalan zaman. Saya akan menghapusnya, tetapi itu adalah jawaban yang "diterima". Saya akan menyuntikkan pendapat saya sebagai gantinya.
Saya tidak akan menganjurkan melakukan ini lagi. Sebaliknya, saya akan memisahkan semua template menjadi file HTML individual. Beberapa akan menyarankan untuk memuat ini secara asinkron (Require.js atau semacam cache template). Itu berfungsi dengan baik pada proyek kecil tetapi pada proyek besar dengan banyak templat, Anda mendapati diri Anda membuat banyak permintaan asinkron kecil pada pemuatan halaman yang sangat tidak saya sukai. (ugh ... ok, Anda bisa menyiasatinya dengan Require.js dengan melakukan pra-kompilasi dependensi awal Anda dengan r.js, tetapi untuk template, ini masih terasa salah bagi saya)
Saya suka menggunakan grunt task (grunt-contrib-jst) untuk mengkompilasi semua template HTML menjadi satu file templates.js dan memasukkannya. Anda mendapatkan yang terbaik dari semua template IMO ... dunia yang ada dalam file, kompilasi template tersebut terjadi pada waktu build (bukan runtime), dan Anda tidak memiliki seratus permintaan asinkron kecil saat halaman dimulai.
Segala sesuatu di bawah ini adalah sampah
Bagi saya, saya lebih suka kesederhanaan menyertakan file JS dengan template saya. Jadi, saya mungkin membuat file bernama view_template.js yang menyertakan template sebagai variabel:
app.templates.view = " \
<h3>something code</h3> \
";
Kemudian, sesederhana memasukkan file skrip seperti yang biasa dan kemudian menggunakannya dalam tampilan Anda:
template: _.template(app.templates.view)
Mengambil langkah lebih jauh, saya benar-benar menggunakan coffeescript, jadi kode saya sebenarnya lebih terlihat seperti ini dan menghindari karakter pelarian akhir baris:
app.templates.view = '''
<h3>something code</h3>
'''
Menggunakan pendekatan ini menghindari brining di require.js yang sebenarnya tidak diperlukan.
Inilah solusi sederhana:
Menggunakan "async: false" di sini bukanlah cara yang buruk karena bagaimanapun Anda harus menunggu hingga template dimuat.
Jadi, fungsi "render"
[Saya mengedit jawaban daripada meninggalkan komentar karena saya percaya ini penting.]
jika template tidak muncul di aplikasi asli , dan Anda lihat
HIERARCHY_REQUEST_ERROR: DOM Exception 3
, lihat jawaban oleh Dave Robinson untuk Apa sebenarnya yang dapat menyebabkan "HIERARCHY_REQUEST_ERR: DOM Exception 3" -Error? .Pada dasarnya, Anda harus menambahkan
ke permintaan $ .ajax.
sumber
dataType: 'html'
permintaan ajax kita, untuk berjaga-jaga?Mixin ini memungkinkan Anda untuk membuat template eksternal menggunakan Menggarisbawahi dengan cara yang sangat sederhana:
_.templateFromUrl(url, [data], [settings])
. Metode API hampir sama dengan _.template () Underscore . Caching disertakan.Pemakaian:
sumber
Saya tidak ingin menggunakan require.js untuk tugas sederhana ini, jadi saya menggunakan solusi koorchik yang dimodifikasi.
Mengapa menambahkan template ke dokumen, daripada menyimpannya dalam objek javascript? Karena dalam versi produksi saya ingin membuat file html dengan semua template sudah disertakan, jadi saya tidak perlu membuat permintaan ajax tambahan. Dan pada saat yang sama saya tidak perlu melakukan pemfaktoran ulang dalam kode saya, seperti yang saya gunakan
dalam tampilan Backbone saya.
sumber
async: false
tidak digunakan lagi sekarangasync: false
tidak digunakan lagi, saya meningkatkan jawabannya, dengan menambahkancomplete
panggilan balik.Ini mungkin sedikit keluar dari topik, tetapi Anda dapat menggunakan Grunt (http://gruntjs.com/) - yang berjalan di node.js (http://nodejs.org/, tersedia untuk semua platform utama) untuk menjalankan tugas dari garis komando. Ada banyak plugin untuk alat ini, seperti kompiler template, https://npmjs.org/package/grunt-contrib-jst . Lihat dokumentasi di GitHub, https://github.com/gruntjs/grunt-contrib-jst . (Anda juga perlu memahami cara menjalankan pengelola paket node, https://npmjs.org/ . Jangan khawatir, ini sangat mudah dan serbaguna.)
Anda kemudian dapat menyimpan semua templat Anda dalam file html terpisah, menjalankan alat untuk mengkompilasi semuanya menggunakan garis bawah (yang saya yakini merupakan ketergantungan untuk plugin JST, tapi jangan khawatir, pengelola paket node akan menginstal dependensi secara otomatis untuk Anda).
Ini mengkompilasi semua template Anda ke satu skrip, misalnya
Memuat skrip akan menyetel global - "JST" secara default - yang merupakan larik fungsi, dan dapat diakses seperti ini:
JST['templates/listView.html']()
yang mirip dengan
jika Anda meletakkan konten dari tag script itu di (templates /) listView.html
Namun, penendang sebenarnya adalah ini: Grunt hadir dengan tugas ini yang disebut 'watch', yang pada dasarnya akan memantau perubahan pada file yang telah Anda tentukan dalam file grunt.js lokal Anda (yang pada dasarnya adalah file konfigurasi untuk proyek Grunt Anda, dalam javascript ). Jika Anda memiliki grunt, mulailah tugas ini untuk Anda, dengan mengetik:
dari baris perintah, Grunt akan memantau semua perubahan yang Anda buat pada file dan secara otomatis menjalankan semua tugas yang telah Anda siapkan untuk itu di file grunt.js jika mendeteksi perubahan - seperti tugas jst yang dijelaskan di atas. Edit dan kemudian simpan file Anda, dan semua template Anda akan dikompilasi ulang menjadi satu file js, bahkan jika template tersebut tersebar di sejumlah direktori dan subdirektori.
Tugas serupa dapat dikonfigurasi untuk linting javascript Anda, menjalankan tes, menggabungkan dan meminimalkan / uglifying file skrip Anda. Dan semua dapat dikaitkan dengan tugas jam sehingga perubahan pada file Anda akan secara otomatis memicu 'build' baru dari proyek Anda.
Butuh beberapa waktu untuk mengatur dan memahami cara mengonfigurasi file grunt.js, tetapi itu baik, sepadan dengan waktu yang diinvestasikan, dan saya rasa Anda tidak akan pernah kembali ke cara kerja yang sebelumnya kasar
sumber
template: JST['test.html']()
:, tampaknya tidak memuat data dari JST :( (lihat pertanyaan saya di sini: stackoverflow.com/questions/29723392/… )Saya pikir inilah yang dapat membantu Anda. Segala sesuatu dalam solusi berkisar pada
require.js
pustaka yang merupakan file JavaScript dan pemuat modul.Tutorial di tautan di atas menunjukkan dengan sangat baik bagaimana proyek tulang punggung dapat diatur. Sebuah contoh implementasi juga disediakan. Semoga ini membantu.
sumber
Saya tertarik pada javascript templating dan sekarang saya mengambil langkah pertama dengan backbone. Inilah yang saya pikirkan dan sepertinya bekerja dengan cukup baik.
sumber
get
fungsi Anda , saya mungkin akan mengembalikan$.ajax
dirinya sendiri sehingga mengembalikan objek promise jadi jika template Anda tidak langsung merespons.Saya harus menyetel jenis data ke "teks" agar berfungsi untuk saya:
sumber
Saya menemukan solusi yang cocok untuk saya dengan menggunakan jQuery.
Saya menambahkan kode template garis bawah, dengan metode jQuery.load (), ke file html utama.
Setelah itu, saya menggunakannya untuk membuat template. Semua harus terjadi secara serempak!
Konsepnya adalah:
Saya memiliki kode template peta garis bawah:
Dan saya memasukkan kode itu ke dalam file bernama map-template.html
Setelah itu saya membuat pembungkus untuk file template.
Kemudian saya memasukkan file itu ke file html utama saya seperti itu.
Di kepala:
Bersulang.
sumber
Saya tahu pertanyaan ini benar-benar tua tetapi muncul sebagai hasil pertama pencarian google untuk templat ajax garis bawah.
Saya lelah karena tidak menemukan solusi yang baik untuk ini, jadi saya membuatnya sendiri:
https://github.com/ziad-saab/underscore-async-templates
Selain memuat template garis bawah menggunakan AJAX, ia menambahkan fungsionalitas <% include%>. Semoga bisa bermanfaat bagi seseorang.
sumber
Saya agak tidak nyaman memaksa jQuery berfungsi secara sinkron, jadi saya memodifikasi contoh sinkron sebelumnya menggunakan promise. Ini hampir sama, tetapi berjalan secara asinkron. Saya menggunakan template hbs dalam contoh ini:
Kemudian untuk menggunakan html yang dirender:
CATATAN: Seperti yang didiskusikan oleh orang lain, akan lebih baik jika mengkompilasi semua template menjadi satu file templates.js dan memuatnya di awal daripada memiliki banyak panggilan AJAX sinkron kecil untuk mendapatkan template saat halaman web dimuat.
sumber
Peringatan maju - Inilah naga:
Saya menyebutkan pendekatan yang ditunjukkan di bawah ini hanya untuk membantu mereka yang berjuang untuk membuat tumpukan ASP.NET (dan kerangka kerja serupa) bekerja secara harmonis dengan ekosistem js-libs. Sudah jelas bahwa ini bukan solusi umum. Karena itu ...
/ endforwardwarning
Jika Anda menggunakan ASP.NET, Anda dapat mengeksternalisasi template Anda hanya dengan menempatkannya di dalam satu atau beberapa tampilan parsial milik mereka. Aka di dalam .cshtml Anda:
Di dalam template.cshtml Anda:
Dan sekarang Anda bisa menggunakan template seperti biasa:
Semoga pendekatan yang sangat sulit dipahami ini membantu seseorang menghemat waktu satu jam untuk menggaruk-garuk kepala.
sumber