2

スペースを含む属性を持つモデルがあります。これは大丈夫そうです。ただし、アンダースコア テンプレートに渡すのに問題があります。

私の正確な問題については、このフィドルを参照してください。

var Person = Backbone.Model.extend({
    defaults: {
    'first name' : 'Mendel'
}
});
var person = new Person();
var template = _.template("Hello <%= 'first name' %>!");
console.log(person.get('first name'));
// Possible ??
console.log(template(person.attributes));

解決策を探してみましたが、今のところうまくいきません。

ありがとう!

4

1 に答える 1

4

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

于 2013-04-11T18:44:28.967 に答える