验证保存并保存()。完成 - 在主干中

时间:2013-02-15 09:54:09

标签: backbone.js

我的模型验证有问题。似乎不可能使用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' 

据我所知,它可能尝试对返回值运行完整的回调但是如何解决这个问题???

3 个答案:

答案 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")
}