backbone.js - 如何使用 Backbone.Model.save() promise 进行验证

标签 backbone.js jquery-deferred

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

var promise = model.save();

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

$.when(promise).fail(function() {
   console.log('dang');
});

但是,$.when()当通过非 promise 火灾时,done() ,所以,在上面,如果模型无效,$.when(false).done()火灾,你会得到“成功!”。

我知道我可以使用 successerror save() 中的属性,但对于我的代码,有多个 done() 是有利的稍后应用的功能。毕竟这就是 promise 的力量。

所以,我只剩下:
var promise = model.save();

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

    $.when(promise).fail(function() {
        console.log('dang');
    });
} else {
    console.log('dang');
}

我讨厌不干燥。
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();
}

变得很乱。你得到了图片。我希望我只是在这里遗漏了一些东西。

最佳答案

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

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"); 
});

试试这个 fiddle

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

关于backbone.js - 如何使用 Backbone.Model.save() promise 进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18907247/

相关文章:

javascript - 使用 jQuery deffered.resolveWith() 在单个参数中传递数组

javascript - 访问父 View 的属性

javascript - backbone.sync 获取所有响应错误状态码

javascript - 我的主干 js 路由器无法工作

javascript - 在 Marionette 中从另一个应用程序调用一个应用程序的 View

backbone.js - 为什么调用触发器 : true in the navigate function of backbone. js 被认为是不好的做法?

jquery - 将 Backbone Js 与 jQuery Deferred 结合使用

javascript - 将回调附加到充当一次触发的全局事件的 promise 的概念是否有一个名称? (如 $(document).ready())

jquery - 如果回调可能需要拒绝延迟对象,我可以手动解析它吗?

javascript - jquery - xeditable select source using function,使用延迟和本地存储(indexedDB)