我正在尝试使用从 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()
火灾,你会得到“成功!”。我知道我可以使用
success
和 error
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/