Ajax 防止主干集在保存后验证
我尝试在主干模型上进行客户端验证,该主干模型涉及对服务器的ajax调用,以确定新条目是否与现有条目重复(通过匹配标题确定)。这是步骤Ajax 防止主干集在保存后验证,ajax,validation,backbone.js,save,set,Ajax,Validation,Backbone.js,Save,Set,我尝试在主干模型上进行客户端验证,该主干模型涉及对服务器的ajax调用,以确定新条目是否与现有条目重复(通过匹配标题确定)。这是步骤 检查型号是否为新型号 如果是新的,AJAX将从validate()获取,以查看模型是否已经存在(按标题) 如果响应=重复设置状态无效,则继续执行save() 我遇到的问题是主干网正在执行以下操作 保存() validate():获取不重复的返回 验证已通过,set() validate():GET返回重复的 我的问题是如何防止第二个validate()在集合上触发
validate()
获取,以查看模型是否已经存在(按标题)save()
validate()
在集合上触发,因为它触发了另一个GET请求,并且我得到了一个错误响应,即使从技术上讲,我已经“完成”了保存
要保持简短,这里是验证和保存调用
List=Backbone.Model.extend({
idAttribute:“\u id”,
urlRoot:“/api/lists”,
...
验证:函数(attrs){
//如果我们正在编辑,请不要为此烦恼(现在)
if(this.isNew()){
//查看此标题是否已存在
var结果=“”;
$.ajax({
url:“/api/lists/”+this.generateTileKey(attrs.title),
键入:“获取”,
async:false,
成功:功能(数据){
结果=数据;
}
});
如果(result.length>0){
返回{
字段:“标题”,
errMsg:“您已经拥有此列表”
};
}
}
}
});
ListView=Backbone.View.extend({
...
保存:函数(){
var _self=这个;
变量字段={
标题:_self.$el.find('input[name=“new list name”]”)val()
}
_self.resetErrors();
_self.model.save(字段、{
等等:是的,
沉默:是的,
成功:功能(模型,res){
如果(res.err){
//添加用户界面错误
}否则{
新的app.View({model:_self.model});
_self.close();
}
},
错误:函数(模型,res){
log(“内部错误”);
}
})
}
});
app.post('/api/lists',函数(req,res){
var list=新的ListModel({
titleKey:generateTitleKey(要求正文标题),
标题:req.body.title
});
返回列表。保存(函数(错误){
如果(!err){
返回res.send(列表);
}否则{
返回res.status(409).send(JSON.stringify({
呃:是的,
errSrc:“列表”,
错误类型:“插入”,
这已经是一个列表了
}));
}
});
});
无声:true似乎对我不起作用,save()和set()都是触发器validate()
我知道有很多方法可以进行错误处理以进行验证,但我有意尝试使用主干模型所使用的本机valide方法,在我尝试将其用于ajax调用之前,它一直工作得很好。我离这里很近,我能尝到。你可以告诉模型不要用
model.set('something',true,{validate:false})验证集合代码>。仅供参考,如果需要,您可以在选项散列中执行相同操作。保存选项散列
你到底在设置什么?通常情况下,服务器响应是要保存在客户机模型上的属性,因此您可以返回该属性上所需的内容,并避免调用set。您可以告诉模型不要使用model.set('something',true,{validate:false})验证集合代码>。仅供参考,如果需要,您可以在选项散列中执行相同操作。保存选项散列
你到底在设置什么?通常情况下,服务器响应是要保存在客户机模型上的属性,因此您可以返回该属性上所需的内容,并避免调用set。您可以告诉模型不要使用model.set('something',true,{validate:false})验证集合代码>。仅供参考,如果需要,您可以在选项散列中执行相同操作。保存选项散列
你到底在设置什么?通常情况下,服务器响应是要保存在客户机模型上的属性,因此您可以返回该属性上所需的内容,并避免调用set。您可以告诉模型不要使用model.set('something',true,{validate:false})验证集合代码>。仅供参考,如果需要,您可以在选项散列中执行相同操作。保存选项散列
你到底在设置什么?通常情况下,服务器响应是您希望保存在客户端模型上的属性,因此您可以返回您需要的属性,避免调用集合。Dominic Tobias让我找到了正确的答案
isNew()
不能用作检查,因为在服务器的响应中,模型在设置之前已经过验证,因此在验证post save()集时,isNew()在技术上仍然是正确的。我将check-in validate()更改为if(attrs.\u id)
,一切正常。多米尼克·托拜厄斯(Dominic Tobias)给了我正确的答案
isNew()
不能用作检查,因为在服务器的响应中,模型在设置之前已经过验证,因此在验证post save()集时,isNew()在技术上仍然是正确的。我将check-in validate()更改为if(attrs.\u id)
,一切正常。多米尼克·托拜厄斯(Dominic Tobias)给了我正确的答案
isNew()
不能用作检查,因为在服务器的响应中,模型在设置之前已经过验证,因此在验证post save()集时,isNew()在技术上仍然是正确的。我将check-in validate()更改为if(attrs.\u id)
,一切正常。多米尼克·托拜厄斯(Dominic Tobias)给了我正确的答案
isNew()
不能用作检查,因为在服务器的响应中,模型在设置之前已经过验证,因此在验证post save()集时,isNew()在技术上仍然是正确的。我换了房间