Pertanyaan Apakah mungkin untuk `mengikat 'helper setang sebelum merender? (menggunakan express & hbs)


Saya punya fitur yang disebut pembantu yang terlihat seperti ini:

hbs.registerHelper('feature', function(request, flag, options) {
  if (features(flag, request)) {
    return options.fn(this);
  } else if (options.inverse) {
    return options.inverse(this);
  }
});

Dan digunakan dalam template berulang-ulang seperti ini:

{{feature request "some-feature"}} ... {{/feature}}

Saya ingin dapat menghapus request bagian dalam template karena selalu bernilai sama dan tidak pernah berubah. Jadi saya membayangkan saya bisa mengikat request untuk feature ketika itu diberikan, dan jelas itu berubah setiap kali dan saya tidak ingin itu tumpah ke permintaan lain.

Sesuatu seperti:

res.render("page", {
  feature: hbs.helper.feature.bind(null, req)
});

Apakah ini mungkin?


7
2018-02-23 18:41


asal


Jawaban:


Jika Anda tidak menggunakan mode pembantu yang dikenal, maka evaluasi helper akan memeriksa konteksnya sehingga Anda dapat lulus dalam ikatan seperti yang Anda miliki di atas dan itu akan bekerja.

Di bawah kode terbaru di setang master eval adalah sesuatu seperti:

helper = helpers.foo || (depth0 && depth0.foo) || helperMissing
helper.call(depth0, 1, {"name":"foo","hash":{},"data":data}

Dimana depth0 adalah objek konteks saat ini. Peringatan di sini adalah bahwa para pembantu diberikan prioritas sehingga Anda perlu memberi nama mereka secara berbeda. Anda juga harus bisa melakukan sesuatu seperti itu {{./foo bar}} untuk memberikan prioritas pada versi konteks lokal tetapi tampaknya kami memiliki bug di mana yang tidak dihormati di bawah konstruksi sintaks khusus ini.


2
2018-03-17 17:43