2016-07-29 14 views
0

私のコードが機能しない理由を教えてください。 Jquery Ajaxを使用してフォームを送信するために、私はエクスプレス幅のハンドルバーを使用しています。最初のレンダリングは正しく動作しますが、2番目のレンダリングは正しく動作しませ問題は「res.render」を入れ子にすることだと思います。私はあなたが正しいと思いますエクスプレスとハンドルバーを使用してレンダリングテンプレートが残っています

app.js

var express = require('express'); 
var app = express(); 
var template = require('consolidate'); 
var handlebars = require('handlebars'); 
var bodyparser = require('body-parser'); 

app.use(bodyparser.urlencoded({extended: false})); 
app.engine('hbs', template.handlebars); 
app.set('view engine', 'hbs'); 
app.set('views', __dirname); 

app.get('/', function(req, res) { 
    res.render('index', { 
    myName: 'John' 
    }); 
}); 
app.post('/', function(req, res) { 
    var obj = {surname: req.body.surname, age: req.body.age}; 
    res.render('Layout.hbs', obj, function(err, html) { 
    if(err) { 
     console.log(err); 
    } else { 
     console.log(html); 
     res.render('index.hbs', { 
     content: html 
     }) 
    } 
    } 
); 
}); 

app.listen(8080, function() { 
    console.log('App listening on 8080'); 
}); 

index.hbs

<div class="wrapper"> 
    <div class="container"> 
     <p>{{myName}}</p> 
    </div> 
    <form action="" name="form" id="form" method="post"> 
     <input id="surname" type="text" name="surname" placeholder="surname"><br/> 
     <input id="age" type="text" name="age" placeholder="age"><br/> 
     <input type="submit"> 
    </form> 
    {{{content}}} 
    </div> 
    <script type="text/javascript"> 
    $(document).ready(function() { 
     $('form').on('submit', function(e) { 
     e.preventDefault(); 
     var form = $(this); 
     var surname = form.find('#surname').val(); 
     var age = form.find('#age').val(); 
     $.ajax({ 
      type: 'POST', 
      data: {surname: surname, age: age}, 
      success: function(res) { 
      console.log('Success'); 
      }, 
      error: function(err) { 
      console.log(err); 
      } 
     }); 
     }); 
    }); 
    </script> 

:-)あなたの答えLayout.hbs

<div class="inner-container"> 
    <h1>{{surname}}</h1> 
    <h2>{{age}}</h2> 
    <p>Render</p> 
</div> 
+0

ことによってそれを交換してくださいなぜあなたは 'の呼び出し)(' res.renderをネストしていますか?コンテンツのレンダリングで十分です。 – jfriend00

+0

「レイアウト」テンプレートを「インデックス」内にレンダリングする必要があります。どのように入れ子レンダリングなしでこれを実行できますか? – Dima

+0

ハンドルバーには、メインテンプレート内に別のテンプレートを埋め込む独自のメカニズムがあります。 'res.render()'を2回コールするのではなく、そのメカニズムを使う必要があります。実際のテンプレートを表示し、達成しようとしていることをより詳細に説明すると、私たちは助けてくれる可能性が高くなります。 – jfriend00

答えて

1

に願って、問題があります入れ子になったres.renderres.renderに電話すると、htmlをレンダリングし、クライアントにステータスコード200で送信します。

ルートレベルでapp.render、ルート/ミドルウェア内でres.renderと呼ぶことができます。しかし、res.renderapp.renderを内部的に使用してテンプレートファイルをレンダリングすることに注意してください。私は別々にテンプレートをレンダリングする必要はないと思います。

回答がお役に立てば幸いです。あなたが得ているエラーログを見ることができたら、私が答えてくれる方が良いでしょう。あなたがそれを提供すれば私はそれに応じて私の答えを変えるでしょう。

0

私は

$('form').on('submit', function(e) { 

...()メソッドにして委任イベントを結合して、問題を考える

$(document).on('submit','form', function(e)){ 
関連する問題