根本的な問題は次の_.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 変数名でもある場合、問題は解決します。