我的模型验证有问题。似乎不可能使用save()。complete(function(){.....在验证的同时 - 这里是代码:
我的模特:
App.Models.Task = Backbone.Model.extend({
defaults: {
title:'',
completed: 0
},
validate: function (attrs, options) {
if(attrs.title == '' || attrs.title === undefined) {
return "fill title pls"
}
},
urlRoot: 'tasks'
});
然后在我的视图中我尝试将其保存在add方法中:
App.Views.TaskAdd = Backbone.View.extend({
tagName: 'div',
template: template('taskTemplateAdd'),
events : {
'click .addTask' : 'add'
},
initialize: function () {
this.model.on('add',this.render, this)
},
add : function () {
var title = $("#addNew input:eq(0)").val();
var completed = $("#addNew input:eq(1)").val();
this.model.set('title', title);
this.model.set('completed', completed);
this.model.save({},
{
success: function (model, response) {
console.log("success");
},
error: function (model, response) {
console.log("error");
}
}).complete(function () {
$("<div>Data sent</div>").dialog();
$('#list').empty();
});
},
render: function () {
this.$el.html(this.template(this.model.toJSON()));
return this
}
});
验证火灾时我收到错误:
Uncaught TypeError: Object false has no method 'complete'
据我所知,它可能尝试对返回值运行完整的回调但是如何解决这个问题???
答案 0 :(得分:6)
如果成功,Model.save documented会返回jqHXR
个对象,如果没有,则返回false
。
因此,除非您的服务器永远不会失败,否则您需要处理save
返回false
的情况。这是您需要的逻辑的简单示例:
var valid=this.model.save();
if(!valid) {
// do something when not valid
else {
valid.complete(function() {}); // this is a jqHXR when valid
}
而且,从jQuery 1.8开始,complete
的使用是deprecated。您应该考虑使用always
代替。
答案 1 :(得分:0)
使用。
...
add : function () {
var self = this;
this.model.save({'title':$("#addNew input:eq(0)").val(),'completed':$("#addNew input:eq(1)").val()},
{
success: function (model, response) {
console.log("success");
self.complete();
},
error: function (model, response) {
console.log("error");
self.complete();
}
});
},
complete: function () {
$("<div>Data sent</div>").dialog();
$('#list').empty();
},
...
答案 2 :(得分:0)
model.save()首先执行验证(模型上的验证方法)。如果成功,则它将POST / PUT发送到服务器。换句话说,如果客户端验证失败,则会出现错误。它不会发布到服务器。如果失败,则无法使用延迟对象,因为false.always()可能会导致错误。
此外,如果你没有在model.save选项中传递wait:true,它将使用其经过验证的对象更新模型。我通常会等待:真的只是为了确定。 (我不想渲染两次元素。)
如果模型未通过客户端验证,那么它也应该在服务器端验证失败。在这种情况下,有一个“无效”事件要收听。所以你只应对成功电话感兴趣。理论上它应该只是有趣的,如果它确实有更新(会触发“更改”事件)
add: {
var self = this;
this.model.on('invalid', function(error){
console.log(error, 'model is invalid. Check model.validate')
});
this.model.on('change', function(model){
console.log(model.toJSON(), 'model has successfully changed')
});
this.model.on('error', function(error){
console.log("server failed to acknowledge (server connection not made)")
});
this.model.on('sync', function(resp){
console.log("server successfull acknowledged (server connection made)")
});
this.model.save(
{
title:$("#addNew input:eq(0)").val(),
completed:$("#addNew input:eq(1)").val()
},
{
wait: true,
success: function (model, response) {
console.log("success");
#fires an change event if the model is updated
self.complete();
},
error: function (model, response) {
console.log("error");
self.complete();
}
}
);
},
complete: function(){
console.log("show this")
}