我正在使用原型1.7并构建一个基本上采用div列表并构建标签界面的类。
var tabs = Class.create({
initialize: function(container, options) {
this.options = Object.extend({
// additional options
tabsRendered: null,
}, options || {});
// init code
if( this.options.tabsRendered ) {
this.options.tabsRendered();
}
},
// additional methods
setCurrent: function(link){
//adds a .current class to tab clicked and its corresponding section
}
};
new vtabs( 'products', {
tabsRendered: function(){
if( window.location.hash != "" ) {
var link = $$( 'a[href$="' + window.location.hash + '"]');
this.setCurrent(link);
}
}
});
我的问题与我的 tabsRendered 自定义回调有关。回调运行时,this.setCurrent(link)
什么都不做。
如果我将此传递给回调,我的自定义回调会按预期工作。
if( this.options.tabsRendered ) {
this.options.tabsRendered(this);
}
我的猜测是将 this 传递给回调并非最佳做法。那么,我如何允许从回调中访问方法?
由于
答案 0 :(得分:2)
问题是tabsRendered
未绑定。使用Prototype,您必须使用bind()
绑定匿名函数。在// init code
之后:
if (Object.isFunction(this.options.tabsRendered))
this.options.tabsRendered = this.options.tabsRendered.bind(this);
之后你可以调用this.options.tabsRendered()
,在那个曾经匿名的函数中,this
将引用正确的对象。有关绑定的详细信息,请参阅the Prototype API docs。
编辑:评论:匿名函数不是唯一受影响的函数是正确的。它是函数定义范围内的this
。