1

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

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

4

3 回答 3

6

Model.save记录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推荐使用. 您应该考虑always改用。

于 2013-02-15T12:02:58.193 回答
0

model.save() 首先执行验证(模型上的验证方法)。如果它成功,那么它会向服务器执行 POST/PUT。换句话说,如果客户端验证失败,你会得到一个 false。然后它不会发布到服务器。如果失败,则不能使用延迟对象,因为 false.always() 可能会导致错误。

另外,如果您没有在 model.save 选项中传递 wait: true ,它将使用其经过验证的对象更新模型。我通常会通过 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")
}
于 2013-02-15T13:45:40.390 回答
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();
      },
      ...
于 2013-02-15T10:44:34.937 回答