Backbone.js模型验证无法阻止模型保存

Backbone.js模型验证无法阻止模型保存,backbone.js,Backbone.js,我已经为Backbone.js模型定义了一个验证方法。问题是,即使验证失败(即Model.validate方法返回一个值),post/put请求仍会发送到服务器。这与Backbone.js文档中的解释相矛盾。我无法理解我做错了什么 以下是模型定义: /** *模型接触 */ var触点=主干.Model.extend({ urlRoot:“/contacts.json”, idAttribute:“\u id”, 默认值:函数(){ 返回{ 姓:'', 给定的名称:“”, 组织:'', 电话:新

我已经为Backbone.js模型定义了一个验证方法。问题是,即使验证失败(即Model.validate方法返回一个值),post/put请求仍会发送到服务器。这与Backbone.js文档中的解释相矛盾。我无法理解我做错了什么

以下是模型定义:

/**
*模型接触
*/
var触点=主干.Model.extend({
urlRoot:“/contacts.json”,
idAttribute:“\u id”,
默认值:函数(){
返回{
姓:'',
给定的名称:“”,
组织:'',
电话:新阵列(),
电子邮件:new Array(),
地址:新阵列({
街道:'',
地区:'',
城市:'',
国家:“,
邮政编码:''
})
};
}
验证:函数(属性){
if(typeof attributes.validationDisabled==='undefined'){
var errors=新数组();
//验证姓氏。
if(u.isEmpty(attributes.姓氏)==true){
错误。推({
键入:“表单”,
属性:'姓',
消息:“请输入姓氏。”
});
}
//验证电子邮件。
if(u.isEmpty(attributes.email)==false){
var emailRegex=/^[a-z0-9.[UZ0%+-]+@[a-z0-9.-]+\[a-z]{2,6}$/i;
//存储未通过验证的电子邮件值的索引。
var emailIndex=新数组();
_.每个(属性、电子邮件、功能(电子邮件、索引){
if(emailRegex.test(email.value)==false){
emailIndex.push(索引);
}
});
//创建错误消息。
如果(emailIndex.length>0){
错误。推({
键入:“表单”,
属性:“电子邮件”,
索引:emailIndex,
消息:“请输入有效的电子邮件地址。”
});
}
}
如果(errors.length>0){
log('表单验证失败');
返回错误;
}
}
}
});
下面是调用Model.save()方法的视图(请参阅下面的方法saveContact()。请注意,出于简洁的原因,下面未包括属于此视图的其他方法

/**
*查看-编辑联系人表单
*/
var EditContactFormView=Backbone.View.extend({
初始化:函数(){
_.bindAll(这是“createDialog”、“formError”、“render”、“saveContact”、“updateContact”);
//添加模板。
此.u editFormTemplate=.template($('#编辑联系人表单tpl').html());
此.u emailFieldTemplate=.template($('.#email field tpl').html());
此.u phoneFieldTemplate=.template($(“#phone field tpl').html());
//获取当前页面的URI。
this.currentPageUri=this.options.currentPageUri;
//创建数组以保存对所有子视图的引用。
this.subViews=新数组();
//设置新联系人或现有联系人的选项。
this.model=this.options.model;
//与模型验证错误事件绑定。
this.model.on('error',this.formError);
这个。render();
}
/**
*处理表单验证错误
*/
formError:函数(模型,错误){
console.log(错误);
},
saveContact:函数(事件){
var self=这个;
//防止触发提交事件触发器。
event.preventDefault();
//触发表单提交事件。
触发器('submit:contactEditForm');
//使用表单值更新模型。
this.updateContact();
//为模型启用验证。通过取消设置validationDisabled完成
//属性。以前应用此设置是为了防止验证
//关于Model.fetch()事件。请参见此.Model.validate()。
this.model.unset('validationDisabled');
//将联系人保存到数据库。
this.model.save(this.model.attributes{
成功:功能(模型、响应){
if(type of response.flash!=“未定义”){
Messenger.trigger('new:messages',response.flash);
}
},
错误:函数(模型、响应){
控制台日志(响应);
抛出错误=新错误('试图保存联系人时发生错误');
},
等等:是吗
});
},
/**
*提取表单值并更新联系人。
*/
updateContact:function(){
this.model.set('姓氏',this.$('#姓氏字段').val();
this.model.set('gived_name',this.$('#gived name field').val();
this.model.set('org',this.$('#org field').val());
//提取地址表单值。
var地址=新数组({
街道:this.$('input[name=“street”]).val(),
地区:this.$('input[name=“district”]).val(),
城市:this.$('input[name=“city”]”)。val(),
国家/地区:此.$('input[name=“country”]”)。val(),
邮政编码:this.$('input[name=“postcode”]”)。val()
});
此.model.set('address',address);
}
});

只是为了简单起见。您是否尝试从validate方法返回一个字符串?您是否调试了代码并检查了错误数组是否确实返回了?正在等待您的响应“:@Deeptechtons:errors数组正在返回到视图中的函数formError()。但是没有调用Model.save()的错误回调(它总是调用成功回调)。@Benjen请尝试以下
this.Model.save({},{success:function(Model,response){if(typeof response.flash!=='undefined'){Messenger.trigger('new:messages',response.flash);}},错误:函数(model,response){console.log(response);throw error=new error('试图保存联系人时发生错误');}
@Deeptechtons我尝试过进行更改,但仍然不起作用。@Benjen可能是您可以尝试使用JSFIDLE复制问题?然后我们可以确定问题是从哪里产生的