我是 Ember.js 的新手,有一个关于清理代码的问题。我正在使用 Ember(v1.0.0-rc.1)、Handlebars("1.0.0-rc.3") 和 Bootstrap(v2.3.1)。
以我的以下模板之一:
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="inputEmail">Name</label>
<div class="controls">
{{view Ember.TextField valueBinding="name" id="inputEmail"}}
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputNumber">ID Number</label>
<div class="controls">
{{view Ember.TextField valueBinding="number" id="inputNumber"}}
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputContactName">Contact Name</label>
<div class="controls">
{{view Ember.TextField valueBinding="invoiceContactName" id="inputContactName"}}
</div>
</div>
<div class="control-group">
<label class="control-label" for="inputContactEmail">Contact Email</label>
<div class="controls">
{{view Ember.TextField valueBinding="invoiceContactEmail" id="inputContactEmail"}}
</div>
</div>
</form>
现在我有了这个丰富的视图框架,所有的重复都感觉很肮脏!问题是模板的性质......我也需要传入我正在绑定的对象,并更改模板将呈现的值。我的第一次尝试是“嵌套”Handlebars 模板……这很混乱,我什么也没有。我的第二次尝试是创建一个“预处理器”来在 Handlebars 编译模板字符串之前对其进行修改……这看起来更简洁,但根本不起作用……结果是当我们在视图上调用“模板”时是脱离上下文的方式。下面的例子:
App.BootstrapTextField = Ember.View.extend({
displayLabel: null,
valueToBind: null,
classNames: ['control-group'],
templateString: '<div class="control-group">' +
'<label class="control-label" for="input##valueToBind##">##displayLabel##</label>' +
'<div class="controls">' +
'{{view Ember.TextField valueBinding="##valueToBind##" id="input##valueToBind##"}}' +
'</div>' +
'</div>',
preprocessTemplate: function () {
var template = this.templateString.replace(/##valueToBind##/g, this.get('valueToBind'));
return template.replace(/##displayLabel##/, this.get('displayLabel'));
},
template: Ember.Handlebars.compile(this.preprocessTemplate())
})
错误:
Uncaught TypeError: Object [object global] has no method 'preprocessTemplate'
我的问题是:清理它的最佳方法是什么?