web-dev-qa-db-ja.com

EJSで変数をHTMLとしてレンダリングする

Node.jsのフォームライブラリ( Forms )を使用しています。これにより、バックエンドでフォームがレンダリングされます。

var signup_form = forms.create({
    username: fields.string({required: true})
    , password: fields.password({required: true})
    , confirm:  fields.password({
        required: true
        , validators: [validators.matchField('password')]
    })
    , email: fields.email()
});
var signup_form_as_html = signup_form.toHTML();

最後の行var signup_var signup_form_as_html = signup_form.toHTML();は、次のようなHTMLのブロックを作成します。

<div class="field required"><label for="id_username">Username</label><input type="text" name="username" id="id_username" /></div><div class="field required"><label for="id_password">Password</label><input type="password" name="password" id="id_password" /></div><div class="field required"><label for="id_confirm">Confirm</label><input type="password" name="confirm" id="id_confirm" /></div><div class="field"><label for="id_email">Email</label><input type="text" name="email" id="id_email" /></div>

基本的には、HTMLの長い文字列です。次に、次のコードを使用してEJSとExpressを使用してレンダリングを試みます。

res.render('signup.ejs', {
    session: loginStatus(req)
    , form: signup_form_as_html
});

しかし、HTMLのレンダリングでは、実際のHTML(したがって、希望どおりのフォーム)ではなく、上に投稿した単なる文字列です。その文字列をEJSを使用して実際のHTMLとしてレンダリングする方法はありますか?または、Jadeのようなものを使用する必要がありますか?

83
MrJaeger

Ejsを使用すると、

<% code %> 

...これは評価されるが印刷されないコードです。

<%= code %>

...これは、評価および印刷(エスケープ)されるコードです。

<%- code %>

...これは評価され、出力される(エスケープされない)コードです。

変数を出力し、エスケープしたくないので、コードは最後の型(-<%付き)になります。あなたの場合:

<%- my_form_content %>

詳細については、 完全なejsドキュメント を参照してください

250
Jakub Oboza

2017年10月の更新

new ejs(v2、v2.5.7)開発はここで行われています: https://github.com/mde/ejs =古いejs(v0.5.x、0.8.5、v1.0.0)はここから入手できます https://github.com/tj/ejs

Ejsを使用すると、さらに多くのことができます。次を使用できます。

  • <%= %>でエスケープされた出力(エスケープ機能を構成可能)
  • <%- %>を使用したエスケープされていない生出力
  • -%>終了タグを使用した改行トリムモード( 'newline slurping')
  • <%_ _%>を使用した制御フローのホワイトスペーストリムモード(すべてのホワイトスペースを丸lurみ)
  • <% %>を使用した制御フロー

そのため、あなたの場合は<%- variable %>になります。ここでvariableは次のようなものです

var variable = "text here <br> and some more text here";

これが誰かの助けになることを願っています。 ????

10
Pavel Kovalev

データベースにhtmlとして保存されたwysiwygエディターからのtextarea入力のレンダリングで同じ問題がありました。ブラウザはレンダリングしませんが、htmlをテキストとして表示します。何時間も検索した後、私は見つけました

<%= data %>はデータをエスケープしました

<%- data %>leftデータは「生」(エスケープされていない)であり、ブラウザはそれをレンダリングできるようになりました。

0