【发布时间】:2014-08-02 00:39:31
【问题描述】:
我正在尝试对涉及到服务器的 ajax 调用的 Backbone 模型进行客户端验证,以确定新条目是否与现有条目重复(通过匹配标题来确定)。步骤如下
- 检查模型是否是新的。
- 如果是新的,从
validate()获取 AJAX 以查看模型是否已经存在(按标题)。 - 如果响应 = 重复设置状态无效,如果不继续,则继续
save()
我遇到的问题是 Backbone 正在执行以下操作。
- 保存()
- validate() : GET 返回不重复
- 验证通过,set()
- validate() : GET 返回重复
我的问题是关于如何防止第二个 validate() 在设置上触发,因为它触发了另一个 GET 请求,即使技术上我“完成”保存,我也会收到错误响应。
为了简短起见,这里是验证和保存调用
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!"
}));
}
});
});
silent: true 似乎对我不起作用,save() 和 set() 都触发了 validate()。
我知道有很多方法可以对验证进行错误处理,但我特意尝试使用主干模型具有的本机验证方法,并且在我尝试将它与 ajax 调用一起使用之前,它一直运行良好.我离这里很近,我可以尝到它。
【问题讨论】:
标签: ajax validation backbone.js save set