我正在创建一个小的JQuery UI小部件,我将处理程序绑定到一个元素:
this.element.bind("keyup", { list: this.container }, this._filter);
小部件有选项:
options:
{
dataUrl: '',
isEnabled: true
},
_filter: function (event)
{
var input = $(this);
var that = this;
alert(that.options.isEnabled);
if (that.options.enabled) {
that.container.show();
event.data.list.find("li").each(function () {
if ($(this).text().toLowerCase().indexOf(input.val().toLowerCase()) < 0) {
$(this).hide();
}
else {
$(this).show();
}
});
}
},
但是当我在_filter中对一个选项发出警报时,我收到一个错误:“that.options is undefined” 对于我尝试访问/使用的任何其他元素也是如此,就好像该函数只能获取内部定义的内容或者传递的eventData中的内容。
我错过了什么吗? 感谢
答案 0 :(得分:1)
问题是侦听器函数(_filter)的范围/上下文/它也是它绑定的jQuery对象。在你的情况下,_filter函数中的这个实际上会在被称为事件监听器时引用小部件的this.element。你能做的是以下几点:
this.element.bind("keyup", { list: this.container }, $.proxy(this, "_filter"));
代理方法的作用基本上是包装将在特定上下文中应用的函数(see documentation)。关于代理的好处是,您可以使用原始函数解除绑定:
this.element.unbind("keyup", this._filter);
希望这有帮助。