我想为jQuery.post()提供一些额外的功能。我希望能够检查服务器的响应并调用不同的回调函数。如何让我的jQuery插件的连锁回调方法?
例如:
$("#frmFoo").postForm("ajax")
.start(function() { showSpinner(); })
.success(function() { alert ("Foo saved"); })
.error(function() { alert ("Foo could not be saved at this time"); })
.validationError(function() { alert("Please fix foo and try again"); })
.complete(function() { hideSpinner(); });
所以我希望能够发回一个一致的JSON对象返回到页面并根据该JSON对象或者调用成功或validationError到validationError提供额外的信息。
UPDATE 这是一个陡峭的学习曲线,我几乎100%肯定我做错了什么。以下是我想要的功能的尝试。
(function ($) {
$.fn.postForm = function (url) {
var options = options || {};
var formData = this.serialize();
var validationCb = jQuery.Callbacks("once memory");
var successCb = jQuery.Callbacks("once memory");
var errorCb = jQuery.Callbacks("once memory");
var completeCb = jQuery.Callbacks("once memory");
var s = jQuery.ajaxSetup({ }, options);
var callbackContext = s.context || s;
foo = {
success: function() {
successCb.add(arguments[0]);
return this;
},
complete: function() {
completeCb.add(arguments[0]);
return this;
},
validationError : function() {
validationCb.add(arguments[0]);
return this;
},
error: function() {
errorCb.add(arguments[0]);
return this;
}
};
$.post(url, formData)
.success(function(data, textStatus, jqXhr) {
if (!data.Success) {
validationCb.fireWith(callbackContext, [data.Message, data.KeyValuePairs]);
} else {
successCb.fireWith(callbackContext, [data, textStatus, jqXhr]);
}
})
.complete(function (jqXhr, textStatus) {
completeCb.fireWith(callbackContext, [jqXhr, textStatus]);
})
.error(function(jqXhr, textStatus, errorThrown) {
errorCb.fireWith(callbackContext, [jqXhr, textStatus, errorThrown]);
});
return foo;
};
})(jQuery);
因此,如何坏的我做了什么?我不熟悉JavaScript和jQuery,我相信我打破了一些必然会咬我的规则。
你是否可以解释一下当你说我正在改变承诺界面时你的意思?我能否将我的插件包装在$ .post或ajax方法中?我不介意是否需要更改回调名称以避免冲突。 – uriDium
我也非常希望能够以那简洁的方式链接回调。 – uriDium
@uriDium这就是问题所在 - 要链接你或者需要增加或者复制类似于'$ .Deferred()'的东西 - 你需要传递一个对象来维护一个单独的回调列表,并且知道哪些对象必须被调用取决于你的内部'$ .post()'调用做了什么。 – Alnitak