11

アンダースコア テンプレートを使用して単純なエスケープされていない HTML をレンダリングするこのサンプル コードがあります。

var template = $(this.el).html(_.template(this.template, {'data': '<script>'}));
$(this.parent).append(template);

しかし、それをレンダリングしようとすると、エラーが発生しました:

キャッチされていない TypeError: オブジェクト [オブジェクト オブジェクト] にはメソッド 'replace' がありません

どなたか原因と解決方法を教えていただけないでしょうか。アンダースコアのドキュメント以降:

var template = _.template("<b>&lt;%- value %></b>");
template({value : '&lt;script&gt;'});
=> "<b>&lt;script&gt;</b>"

前もって感謝します。

4

2 に答える 2

26

細かいマニュアルから:

テンプレート _.template(templateString, [context])

JavaScript テンプレートをレンダリング用に評価できる関数にコンパイルします。

の最初の引数_.templateは、jQuery オブジェクトではなく、文字列である必要があります。_.template関数呼び出しの内部処理の一部であり、String#replaceそれがエラーの原因です。代わりにこれを使用することもできます:

var template = $(this.el).html(_.template(this.template.html(), {'data': '<script>'}));
$(this.parent).append(template);

デモ: http://jsfiddle.net/ambiguous/wPu6G/

あなたが与える例はうまくいきます:

http://jsfiddle.net/ambiguous/w2qWe/

したがって、コメントで言及した「値」が定義されていないというエラーがどこから来ているのかわかりません。

于 2011-11-20T02:23:05.417 に答える
1

サーバーでノードを実行しているときに同じエラーが発生しました。ディスクからテンプレート ファイルを読み取り、エンコーディングを指定しない場合、node.js はバッファを返します。Underscore は文字列を想定しているため、エラーは基本的に同じです。Underscore に文字列を渡すように、エンコーディングを指定していることを確認してください。

これによりエラーが発生します。

var template = _.template(fs.readFileSync('mytemplate.tpl'));

そしてこれは良いです。

var template = _.template(fs.readFileSync('mytemplate.tpl', { 'encoding':'utf8'}));
于 2014-04-03T19:40:52.473 に答える