すべての ajax 呼び出しをラップするために使用する jquery プラグインがあります。入力/出力データの一般的な前/後処理を行うことを目的としています。
(function ($) {
$.ajaxCall = function () {
var myCall = this;
myCall.settings = {};
myCall.ExecuteService = function (caller) {
var ajax = $.ajax({
type: 'POST',
url: '../myWebservice',
dataType: "json",
context: caller,
success: myCall.settings.onSuccess
});
};
};
} (jQuery));
私の問題は、onSuccess イベントを変更して、渡された関数以上のものにしようとするときです。プラグインを利用する次のコードがあります。
this.foo = 'fooStr';
function myOnSuccess(result) {
alert(this.foo);
}
var newCall = new $.ajaxCall();
newCall.settings.onSuccess = myOnSuccess;
newCall.ExecuteService(this);
function myProto() {
this.foo = 'otherFooStr';
}
myProto.prototype.success = function(result){
alert(this.foo);
}
myProto.prototype.makeCall = function(){
var newCall = new $.ajaxCall();
newCall.settings.onSuccess = this.success;
newCall.ExecuteService(this);
}
var proto = new myProto();
proto.makeCall();
これにより、「fooStr」と「otherFooStr」が表示され、正常に動作しているように見えます。しかし、成功のコールバックでより多くのことを行うためにプラグインを変更しようとすると、コンテキストの問題が発生します。
myCall.ExecuteService = function (caller) {
var ajax = $.ajax({
type: 'POST',
url: '../myWebservice',
dataType: "json",
context: caller,
});
ajax.success(function(result,status,xhr){
//*Do some processing to find condition*
if (condition) {
//myCall.settings.onSuccess(result); //shows 'undefined' & 'undefined'
//eval(myCall.settings.onSuccess)(result); //shows 'fooStr' & 'fooStr'
//this.eval(myCall.settings.onSuccess)(result); //shows 'fooStr' & throws an object exception
}
});
};
成功コールバックのコンテキストは正しいですが、onSuccess 関数が呼び出されると失われるようです。私はこれを正しい方法で行っていますか?