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は、成功した場合または失敗した場合にオブジェクトを返すように文書化されています。jqHXRfalse

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

使用する。

...
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 に答える
0

model.save()は、最初に検証を実行します(モデルのvalidateメソッド)。成功すると、サーバーへのPOST/PUTを実行します。つまり、クライアント側の検証が失敗した場合はfalseになります。その場合、サーバーに投稿されません。false.always()はおそらくエラーになるため、これが失敗した場合、遅延オブジェクトを使用することはできません。

また、wait:trueをmodel.saveオプションで渡さない場合、検証済みのオブジェクトでモデルが更新されます。私は通常、待機を渡します。念のために言っておきます。(要素を2回レンダリングしたくありません)。

モデルがクライアント側の検証に失敗した場合、サーバー側の検証にも失敗するはずです。この場合、リッスンする「無効な」イベントがあります。したがって、サクセスコールにのみ関心があるはずです。理論的には、実際に更新がある場合にのみ興味深いはずです(「変更」イベントが発生します)

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 に答える