我试图在Backbone模型上进行客户端验证,该模型涉及对服务器的ajax调用,以确定新条目是否与现有条目重复(通过匹配标题确定)。这是步骤
validate()
获取AJAX GET以查看模型是否已存在(按标题)。save()
我遇到的问题是Backbone正在执行以下操作。
我的问题是关于如何防止第二个validate()
在集合上触发,因为它触发另一个GET请求并且我得到了错误响应,即使在技术上我已经完成了#34;节省。
这里要做的就是验证和保存电话
List = Backbone.Model.extend({
idAttribute: "_id",
urlRoot: '/api/lists',
...
validate: function(attrs) {
// if we are editing don't bother with this (for now)
if (this.isNew()) {
// see if this title already exists
var result = '';
$.ajax({
url: "/api/lists/" + this.generateTitleKey(attrs.title),
type: "GET",
async: false,
success: function(data){
result = data;
}
});
if(result.length > 0) {
return {
field: "title",
errMsg: "You already have this list"
};
}
}
}
});
ListView = Backbone.View.extend({
...
save: function() {
var _self = this;
var fields = {
title: _self.$el.find('input[name="new-list-name"]').val()
}
_self.resetErrors();
_self.model.save(fields, {
wait: true,
silent: true,
success: function(model, res) {
if(res.err) {
// add UI error
} else {
new app.View({ model: _self.model });
_self.close();
}
},
error: function(model, res) {
console.log('inside error');
}
})
}
});
app.post('/api/lists', function(req, res){
var list = new ListModel({
titleKey: generateTitleKey(req.body.title),
title: req.body.title
});
return list.save(function(err){
if(!err) {
return res.send(list);
} else {
return res.status(409).send(JSON.stringify({
err: true,
errSrc: "list",
errType: "insert",
errMsg: "That's already a list!"
}));
}
});
});
无声:真的似乎不适合我,save()和set()都触发validate()。
我知道有许多方法可以对验证进行错误处理,但我故意尝试使用骨干模型所具有的本机valide方法,并且它的工作效果非常好直到我尝试将其用于ajax电话。我离这儿很近,我可以品尝它。
答案 0 :(得分:2)
您可以告诉模型不要使用model.set('something', true, { validate: false });
验证集合。仅供参考,如果需要,您可以在.save
选项哈希中执行相同操作。
你还在设置什么?通常,服务器响应是您要在客户端模型上保存的属性,因此您可以返回所需的内容并避免调用set。
答案 1 :(得分:1)
isNew()
不能用作检查,因为在服务器的响应中,模型在设置之前已经过验证,因此在验证post save()集时,isNew()在技术上仍然是真的。我将对validate()的检查更改为if(attrs._id)
,一切正常。