10

バックボーンでアンダースコアを使用してテンプレートを作成するハンドルバースタイルを使用しようとしています(require.jsを使用)。私は次のものを持っています:

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;

私のテンプレートでは、テストを設定しました。

<div><%= title %> | {{ title }}</div>

ブラウザに次のように表示されます。

Correct title | {{ title }}

したがって、標準のアンダースコアテンプレート設定が機能しており、ハンドルバースタイルの設定が無視されているように見えます。

しかし、Chromeでコンソールをチェックインすると、これが表示されます(これは正しいはずです)

_.templateSettings
Object {evaluate: /<%([\s\S]+?)%>/g, interpolate: /\{\{(.+?)\}\}/g, escape: /<%-([\s\S]+?)%>/g}

これが正しく機能しない理由はありますか?

4

1 に答える 1

18

私がこれをするとき:

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;
var t = _.template($('#t').html());

テンプレートをで使用すると#t、エラーが発生します。

SyntaxError:予期しないトークン'='

これは、正規表現を評価するという私の疑いをうまく確認しました。

/<%([\s\S]+?)%>/g

<%= ... %>テンプレートであなたと一致していました。等号が一致\Sするので、もちろん、evaluate regexは、と<%= ... %>を削除し、ビルドしようとするJavaScriptの構文エラーを残します。<%%>_.template

_.templateソースの内部を見ると、正規表現が特定の順序でチェックされていることがわかります。

  1. escape
  2. interpolate
  3. evaluate

したがって、交換interpolateするだけで、<%= ... %>物事が失敗して捕らえられる(そして誤解される)ことになりますが、evaluate

あなたがする必要があるのは、evaluate正規表現も置き換えることです。問題を回避するために、3つの正規表現すべてを置き換えることをお勧めします。

_.templateSettings = {
    evaluate:    /\{\{(.+?)\}\}/g,
    interpolate: /\{\{=(.+?)\}\}/g,
    escape:      /\{\{-(.+?)\}\}/g
};

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

于 2013-03-25T21:49:28.843 に答える