问题:
我正在尝试制作一个可以在单个表单元素以及表单顶部显示错误消息的表单。
我希望能够将错误存储在模型之外的某个地方。默认情况下,如果我没记错的话,模板中只包含模型属性。所以我正在尝试使用模板助手添加错误。到目前为止,它不起作用并因以下错误而中断:
Uncaught ReferenceError: errors is not defined
相关代码如下:
风景:
var LoginFormView = Marionette.ItemView.extend({
// some view properties
...
errors: [],
templateHelpers: function() {
console.log('LoginFormView.templateHelpers',this, this.errors);
var output = {};
if(this.errors.length) {
output.errors = this.errors;
}
return output;
},
initialize: function(currentUser, options) {
// some initialization
...
this.bindTo(this.model, "loadUser:fail", this.onLoadUserFail, this);
},
...
onLoadUserFail: function() {
alert('Access Denied!');
this.errors.push('Your login credentials are invalid. Please try again.');
this.render();
}
});
LoginFormView 对象只是一个模块定义。它稍后会被实例化并注入到 Backbone.Marionette.Region 中。我不确定这是否与我遇到的问题有关,但我想我会提到它以防万一。
模板:
<script type="text/template" id="login-form-template">
<form class="form-vertical well well-shadow span4">
...
<% if(errors) { %>
<fieldset class="alert alert-error">
<button type="button" class="close" data-dismiss="alert">×</button>
<legend>Oops!</legend>
<ul>
<% _.each(errors, function(error) { %>
<li><%= error %></li>
<% }); %>
</ul>
</fieldset>
<% } %>
...
</form>
</script>
似乎错误没有进入模板,因为错误在模板中被抛出:
<% if(errors) { %>
查看 Backbone.Marionette 源代码,我的印象是 templateHelpers 方法被执行,并且它的输出与“数据”对象(序列化模型)合并。
如果是这样的话,我怎么能访问我的模型的属性,但“错误”属性是未定义的?
解决方案:
joverson很友好地指出了问题所在。我的新 templateHelpers 方法现在如下所示:
errors: [],
templateHelpers: function() {
console.log('LoginFormView.templateHelpers', this, this.errors);
var output = {};
output.errors = this.errors;
return output;
},