Saat ini saya sedang berurusan dengan setang.js dalam aplikasi express.js. Untuk menjaga hal-hal modular, saya membagi semua templat saya menjadi parsial.
Masalah saya : Saya tidak dapat menemukan cara untuk mengirimkan variabel melalui doa parsial. Katakanlah saya memiliki sebagian yang terlihat seperti ini:
<div id=myPartial>
<h1>Headline<h1>
<p>Lorem ipsum</p>
</div>
Mari kita asumsikan saya mendaftarkan parsial ini dengan nama 'myPartial'. Di template lain saya kemudian bisa mengatakan sesuatu seperti:
<section>
{{> myPartial}}
</section>
Ini berfungsi dengan baik, sebagian akan diberikan seperti yang diharapkan dan saya adalah pengembang yang bahagia. Tapi yang saya butuhkan sekarang adalah cara untuk mengirimkan variabel yang berbeda melalui permohonan ini, untuk memeriksa sebagian misalnya, apakah judul diberikan atau tidak. Sesuatu seperti:
<div id=myPartial>
{{#if headline}}
<h1>{{headline}}</h1>
{{/if}}
<p>Lorem Ipsum</p>
</div>
Dan invokasinya akan terlihat seperti ini:
<section>
{{> myPartial|'headline':'Headline'}}
</section>
atau lebih.
Saya tahu, bahwa saya dapat mendefinisikan semua data yang saya butuhkan, sebelum saya membuat templat. Tetapi saya perlu cara untuk melakukannya seperti yang baru saja dijelaskan. Apakah ada cara yang memungkinkan?
sumber
this
, bisakah Anda memberikan konteks Anda sendiri. Misalnya, tentukan data tambahan untuk dilewati, seperti{new_variable: some_data}
?{{> partialName {new_variable: some_data} }}
key=value
. Apakah ada masalah yang membahas hal ini di github?Untuk jaga-jaga, inilah yang saya lakukan untuk mendapatkan argumen parsial, semacam. Saya telah membuat pembantu kecil yang mengambil nama parsial dan parameter hash yang akan diteruskan ke parsial:
Kuncinya di sini adalah bahwa pembantunya Setang menerima hash argumen seperti Ruby . Dalam kode helper, mereka datang sebagai bagian dari argumen terakhir fungsi
options
- - di dalamnyahash
anggota. Dengan cara ini Anda bisa menerima argumen pertama — nama sebagian — dan mendapatkan data setelah itu.Kemudian, Anda mungkin ingin mengembalikan
Handlebars.SafeString
dari helper atau menggunakan "triple-stash" -{{{
- untuk mencegahnya melarikan diri ganda.Berikut ini adalah skenario penggunaan yang kurang lebih lengkap:
Semoga ini bisa membantu ... seseorang. :)
sumber
Ini sangat mungkin jika Anda menulis pembantu Anda sendiri. Kami menggunakan
$
pembantu khusus untuk menyelesaikan jenis interaksi ini (dan banyak lagi):sumber
hbs.registerPartials(path.join(__dirname, '/views/partials'), function() { utils.precompileHandlebarsPartials(hbs); }); // Pre compile the partials precompileHandlebarsPartials : function(hbs) { var partials = hbs.handlebars.partials; for (var partial in partials) { if (typeof partials[partial] === 'string') { partials[partial] = hbs.handlebars.compile(partials[partial]); } }; }
Ini juga dapat dilakukan di versi setang nanti menggunakan
key=value
notasi:Mengizinkan Anda memberikan nilai spesifik ke konteks parsial Anda.
Referensi: Konteks berbeda untuk parsial # 182
sumber
Jawaban yang diterima berfungsi dengan baik jika Anda hanya ingin menggunakan konteks yang berbeda di sebagian Anda. Namun, itu tidak membiarkan Anda referensi salah satu konteks induk. Untuk menyampaikan banyak argumen, Anda harus menulis pembantu Anda sendiri. Berikut ini adalah penolong yang berfungsi untuk Setang
2.0.0
(jawaban lain berfungsi untuk versi<2.0.0
):Kemudian di templat Anda, Anda dapat melakukan sesuatu seperti:
Dan sebagian Anda akan dapat mengakses nilai-nilai itu sebagai konteks seperti:
sumber
Kedengarannya Anda ingin melakukan sesuatu seperti ini:
Yehuda sudah memberi Anda cara untuk melakukan itu:
Tetapi untuk memperjelas:
Untuk memberikan sebagian data Anda sendiri, berikan saja modelnya sendiri di dalam model yang ada, seperti:
Dengan kata lain, jika ini adalah model yang Anda berikan ke template Anda:
Kemudian tambahkan objek baru untuk diberikan kepada parsial:
childContext
menjadi konteks parsial seperti kata Yehuda - dalam hal itu, ia hanya melihat bidanganother
, tetapi tidak melihat (atau peduli dengan bidangsome
). Jika Anda memilikiid
model tingkat atas, dan ulangiid
lagi di childContext, itu akan berfungsi dengan baik karena sebagian hanya melihat apa yang ada di dalamnyachildContext
.sumber
Ya, saya terlambat, tetapi saya dapat menambahkan untuk pengguna Assemble : Anda dapat menggunakan buil-in
"parseJSON"
helper http://assemble.io/helpers/helpers-data.html . (Ditemukan di https://github.com/assemble/assemble/issues/416 ).sumber
Tidak yakin apakah ini membantu, tetapi inilah contoh templat Templat dengan parameter dinamis yang diteruskan ke parsial RadioButtons inline dan klien (peramban) merender tombol radio dalam wadah.
Untuk penggunaan saya ini diberikan dengan Setang di server dan memungkinkan klien menyelesaikannya. Dengannya alat formulir dapat menyediakan data sebaris di dalam Setang tanpa bantuan.
Catatan: Contoh ini membutuhkan jQuery
sumber