根本的な問題は次の_.template
とおりです。
デフォルトでは、テンプレートwith
はデータの値をステートメントを介してローカル スコープに配置します。
そのため、内部で使用するものはすべて<%= ... %>
、有効な JavaScript 変数名であると想定されます。Yourfirst name
は有効な JavaScript 変数名ではないため、すべてがバラバラになります。
簡単な解決策は、手動ですべての名前空間を作成[]
して、プロパティを取得するために使用できるようにすることです。これにより、「JavaScript 変数名にスペースを含めることはできません」という問題を回避できます。
var template = _.template("Hello <%= person['first name'] %>!");
console.log(template({ person: person.attributes}));
デモ: http://jsfiddle.net/ambiguous/5v7XQ/
Underscore をアップグレードしても構わない場合 (良い考えです)、次のdata
オプションを使用できます。
ただし、 variable設定で単一の変数名を指定できます。これにより、テンプレートのレンダリング速度が大幅に向上します。
_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'});
=> "Using 'with': no"
次に、これを行うことができます:
var template = _.template("Hello <%= person['first name'] %>!", null, { variable: 'person' });
console.log(template(person.attributes));
デモ: http://jsfiddle.net/ambiguous/NXhSN/
もう 1 つのオプションは、名前にスペースが含まれる属性の使用を停止することです。すべてのモデル属性名が有効な JavaScript 変数名でもある場合、問題は解決します。