我目前正在编写一个基本上提供提交表单的 Javascript 模块。
在编写它时,我遇到了似乎是一个经典的范围问题。
我希望该submit()
方法进行 AJAX 调用并使用对象方法来处理调用的成功和失败。由于submit()
是事件处理程序,this
不再设置为flagBox
对象。因此,我不再有权访问flagBox.showSuccess()
or flagBox.showFail()
。
起初,我正在寻找一种方法来设置对象范围的自引用,以便我可以调用类似self.showSuccess()
.
现在,我jQuery.proxy()
用来设置处理程序的上下文。
我还考虑过实现 pub/sub 模式或将方法附加到event.data
.
我很好奇还有哪些其他解决方案,以及是否有我没有找到的“最佳实践”。
(function( $ ) {
var FlagBox = function() {};
FlagBox.prototype = {
constructor: FlagBox,
init: function() {
$('.flag-content-box')
.on('submit', $.proxy(this.submit, this));
},
...
showSuccess: function() {
console.log('success');
},
showFail: function() {
console.log('fail');
},
submit: function(event) {
event.preventDefault();
var that = this;
formData = $(event.target).serializeObject();
$.ajax({
type:"POST",
url: '/flag/add.json',
data: formData,
success : function(data) {
that.showSuccess();
},
error : function(jqXHR, textStatus, errorThrown) {
showFail();
}
});
}
};
var flagBox = new FlagBox();
flagBox.init();
})(jQuery);