如何使用Backbone.Model.save()承诺验证

Mat*_*att 5 backbone.js jquery-deferred

我正在尝试使用从中返回的承诺Backbone.model.save().实际上,根据规范,如果有效则返回一个promise,否则返回false.我想在将来deferred.done()deferred.fail()电话中使用返回值,无论类型如何.像这样:

var promise = model.save();

$.when(promise).done(function() {
   console.log('success!');
});

$.when(promise).fail(function() {
   console.log('dang');
});
Run Code Online (Sandbox Code Playgroud)

但是,$.when()当通过非承诺火灾时,done()如上所述,如果模型无效,则会$.when(false).done()触发,并且您获得"成功!".

我知道我可以使用successerror属性save(),但是使用我的代码,done()以后应用多个函数是有利的.这就是承诺的力量.

所以,我留下:

var promise = model.save();

if (promise) {
    $.when(promise).done(function() {
        console.log('success!');
    });

    $.when(promise).fail(function() {
        console.log('dang');
    });
} else {
    console.log('dang');
}
Run Code Online (Sandbox Code Playgroud)

我讨厌不干.

var promise = model.save();

var fail = function() {
    console.log('dang');
};

if (promise) {
    $.when(promise).done(function() {
        console.log('success!');
    });

    $.when(promise).fail(function() {
        fail();
    });
} else {
    fail();
}
Run Code Online (Sandbox Code Playgroud)

弄得很乱.你得到了照片.我希望我在这里遗漏一些东西.

小智 6

您可以覆盖Backbone.save方法以获得所需的行为.如果原始保存函数的返回值是布尔值(这意味着验证失败),则只返回自定义承诺并拒绝其相关的延迟.

var oldSaveFunction = Backbone.Model.prototype.save;
Backbone.Model.prototype.save = function(){
    var returnedValue = oldSaveFunction.apply(this, arguments),
        deferred = new $.Deferred();

    if(_.isBoolean(returnedValue)){
        deferred.reject();
        return deferred.promise();
    }

    return returnedValue;
}

var Person = Backbone.Model.extend({
    url : 'http://www.google.com',
    validate : function(attributes){
         if(!("name" in attributes))
             return "invalid";
    }
});

var person = new Person();
$.when(person.save()).fail(function(){
   console.log("failed"); 
});
Run Code Online (Sandbox Code Playgroud)

试试这个小提琴

http://jsfiddle.net/WNHXz/1/