我是OOP的新手。我有很多ajax调用,我想把它们组合成一个对象。
这是我的功能;
var Ajax_call = function(target) {
this.target = target;
this.data = function(){
return $("#"+this.target+"").parent("form").serialize();
};
this.start = function(){
status(true);
var data = this.data();
$.ajax({
type : "post",
url : $("#"+this.target+"").attr('action'),
data : data + '&ajax=' + 1,
dataType : "json",
timeout : 3000,
success :
function(serv){
if(serv.error){
this.denied(); ///// TypeError: undefined is not a function
}
if(serv.done){
//this.succeed();
}
},
error :
function(x,t,m){
//this.failed();
}
});
};
};
我想在这里定义 denied()方法;
$('body').on('click','#register_submit',function(event){
event.preventDefault();
Ajax_call.denied = function() {
console.log (serv.error);
};
var register = new Ajax_call((this.id));
register.start();
});
谢谢!
这是解决方案;
我将重复变量this
定义为_this
。所以当js重载时,我可以使用_this
代替this
。不需要原型。
宣言;
var Ajax_call = function(target) {
this.target = target;
this.data = function(){
return $("#"+this.target+"").parent("form").serialize();
};
this.denied;
this.start = function(){
var _this = this; /// Js overload on this.
}
Ajax部分;
$.ajax({
type : "post",
url : $("#"+this.target+"").attr('action'),
data : data + '&ajax=' + 1,
dataType : "json",
timeout : 3000,
success :
function(serv){
if(serv.error){
_this.denied(serv); ///// Fixed
}
if(serv.done){
//_this.succeed();
}
},
error :
function(x,t,m){
//_this.failed();
}
});
用法;
$('body').on('click','#register_submit',function(event){
event.preventDefault();
var register = new Ajax_call((this.id));
register.denied = function(serv) {
console.log (serv.error);
};
register.start();
});
答案 0 :(得分:0)
这是this
的范围问题,因为this
在回调函数中具有特殊含义(即,指向调用回调的对象)。将this
保存在本地变量中,稍后再使用。请参阅下面的示例。
this.start = function(){
var self = this;
status(true);
var data = this.data();
$.ajax({
type : "post",
url : $("#"+this.target+"").attr('action'),
data : data + '&ajax=' + 1,
dataType : "json",
timeout : 3000,
success :
function(serv){
if(serv.error){
// this is replaces with self variable
self.denied(); ///// TypeError: undefined is not a function
}
if(serv.done){
//this.succeed();
}
},
error :
function(x,t,m){
//this.failed();
}
});
};
答案 1 :(得分:0)
this
中的this.denied();
指的是成功函数,而不是Ajax_call。因此,稍后设置denied
方法是有效的,但由于JS如何重载this
而无法正常查看。
您可能想要的是使用underscore.js's bind()
等内容将this
绑定到该成功函数。
这看起来像是:
// ...
success: _.bind(function(serv){
if(serv.error){
this.denied();
}
if(serv.done){
//this.succeed();
}
}, this),
// ...