2016-08-22 8 views
0

私は最近、初めてのExpressプロジェクトで作業を始めました.Ghostのブログテーマを作成する際に以前の経験があったので、Handlebarsをテンプレート言語として使用しました。私のexpressハンドルバーテンプレートの中でif文を使用できないのはなぜですか?

Passport.jsとconnect-flashを使用してログイン画面を作成して、エラーメッセージをユーザーに送信します。ハンドルバーのヘルパーとしてエラーメッセージを渡すことができますが、ハンドルバーテンプレートの中にifステートメントを含めると、エラーメッセージが表示されても常にfalseになります。

ここに私のコードです:

login.js(ルート)

app.route('/login') 
    .get(function(req, res) { 
     if (req.isAuthenticated()) { 
      res.redirect('/'); 
     } else { 
      res.render('login', { 
       helpers: { 
        message: req.flash('loginMessage') 
       } 
      }); 
     } 
    }) 
    .post(...); 

login.handlebars

<form action="/login" method="post"> 
    <div> 
     <label>Email</label> 
     <input type="text" name="email"> 
    </div> 
    <div> 
     <label>Password</label> 
     <input type="password" name="password"> 
    </div> 
    <button type="submit">Log In</button> 
</form> 

{{#if message}} 
    <p style="color: red">{{message}}</p> 
{{/if}} 

これはif文なしで動作します:

<p style="color: red">{{message}}</p> 

しかし、私は自分のHTML全体に空の要素を持っているという考えは好きではありません。私が何か非常に単純なものを見逃していると確信しているので、どんな助けも大いに評価されるでしょう。

ありがとうございました。

答えて

1

私は、単一の髭の中で複数のヘルパーを呼び出すには、subexpressionを使用する必要があると思います。修正は、括弧を追加するのと同じくらい簡単である:

{{#if (message)}} 
    <p style="color: red">{{message}}</p> 
{{/if}} 

編集

上記はhelpers.messageでオブジェクトの種類はヘルパーが関数であるHandlebars documentation状態としての機能であると仮定することに注意してください。しかし、connect-flash documentationは、req.flash('loginMessage')が配列を返すことを示唆しています。この場合、結果はヘルパーに割り当てることはないはずですが、ビューモデルオブジェクトの定期的な値である必要があります:messagesが配列であるとして、我々が検索し、アクセスする必要があります、私たちのテンプレート内

res.render('login', { 
    messages: req.flash('loginMessage') 
}); 

その0番目の要素:

{{#if (lookup messages 0)}} 
    <p style="color: red">{{messages.[0]}}</p> 
{{/if}} 
+0

括弧を追加すると、ページを開くときにTypeErrorが発生します。なぜそれが起こっているかもしれないかに関するアイデア? – getmicah

+1

'req.flash( 'loginMessage')'は関数を返しません。それが単なる文字列であれば、私はそれがヘルパーとして意味をなさないとは思わない。なぜあなたのビューモデルデータの通常のプロパティにしないのですか? – 76484

+0

@getmicah:私は自分の答えを編集しました。 – 76484

関連する問題