私はnode.jsサーバーをエクスプレスで記述していて、ある瞬間にいくつかの.jadeページに配列を送信します。問題は、Jadeページをレンダリングするときに、Jadeコンパイラが配列を_[object Object]
_としてレンダリングし、ChromeのJavaScriptコンパイラが「予期しない識別子」と文句を言うことです。
これはジェイドコードです:
_!!! 5
html(lang="en")
head
title= "Rankings"
body
h1 Ranking
div(id="rankings")
script(type='text/javascript')
function fillRanking(){
var rankArray = #{ranking};
alert("inside fillranking");
var divElement = document.getElementById("rankings");
for(var i = 0; i< rankArray.length; i++){
divElements.innerHTML += "" + i+1 + ". " + rankArray[i].Username + " " + rankArray[i].Points;
}
}
fillRanking();
_
ご覧のとおり、非常に簡単です。node.jsからJadeに渡される_#{ranking}
_変数内にある情報をdivに入力するだけです。 _#{ranking}
_変数を割り当てようとするとすぐに予期しない識別子エラーが発生するため、2行目のアラートは発生しません。
以下は、expressを使用したnode.jsのコードです。
_app.get('/ranking', function (req, res) {
//get the first ten people in the ranking
var firstTen = getRanking(10, function(results){
//compute the array of results
var result = {
ranking: [],
}
for(var i = 0; i < results.length; i++){
result.ranking[i] = results[i];
}
//render the ranking with all the info
console.log(result);
res.render(__dirname + '/pages/ranking/ranking.jade', {
ranking: result,
});
});
});
_
結果の配列内にオブジェクトを作成し、クエリから見つけた結果をその中に入れて、レンダリングエンジンに渡します。 console.log(results)
呼び出しは、たとえば次のように、result
オブジェクトを正しく出力します。
_{ ranking:
[ { Username: 'usr1',
_id: 4ed27319c1d767f70e000002,
Points: 100 },
{ Username: 'usr2',
_id: 4ed27326c1d767f70e000003,
Points: 100 } ]
}
_
Jadeページに渡された変数の処理方法がよくわかりません。どちらを実行しても、「予期しない識別子」エラーが発生し続けます。誰かが私がこれを解決する方法を知っていますか?
ありがとう
上記のコメントを見て、もう少し調査すると、これが私がうまくいくことがわかったものです:
Javascript(/ controller)でこれを使用します:
...
res.render(__dirname + '/pages/ranking/ranking.jade', {
ranking: JSON.stringify(ranking),
})
...
そして翡翠のテンプレート:
...
function fillRanking(){
var rankArray = !{ranking};
alert("inside fillranking");
...
これは、!{}がエスケープを実行しないために機能します。
これは私にとってはうまくいきます。
JSON.stringify
サーバー上の配列(または実際には任意のJSONオブジェクト)そしてJSON.parse
クライアントでそれ。
サーバ側:
res.render(__dirname + '/pages/ranking/ranking.jade', {
ranking: JSON.stringify(result),
});
クライアント側:
var rankArray = JSON.parse( !{JSON.stringify(ranking)} );
コントローラーの配列も反復に使用するため、次のようにしました。
res.render('template', pArrayOfData);
そして翡翠のコードでは:
script(type='text/javascript').
var _histData = !{JSON.stringify(pArrayOfData)};
私は同じ問題に遭遇し、わずかな変化でそれを機能させることができました(上記の解決策のおかげで)。
私のコードから:
バックエンド:
JSON配列を文字列化する
router.get('/', function(req, res) {
var data = JSON.stringify(apiData); // <====
res.render('gallery', { data: apiData });
});
フロントエンド:
!{}で再度文字列化する
function injectDataOnView() {
var data = !{JSON.stringify(data)}; // <====
var divElement = document.getElementById('data');
divElement.innerHTML = data[1]['id']; // <=== just a test, so no for loop
}
injectDataOnView();