правильный способ доступа к методу класса в обратном вызове [prototype] - PullRequest
0 голосов
/ 10 декабря 2010

Я использую прототип 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) ничего не делает.

Если я передам this в обратный вызов, мой пользовательский обратный вызов будет работать как положено.

if( this.options.tabsRendered ) {
    this.options.tabsRendered(this);
}

Я предполагаю, что передача этого вобратный вызов не лучшая практика.Итак, как мне разрешить доступ к методу из обратного вызова?

Спасибо

1 Ответ

2 голосов
/ 10 декабря 2010

Проблема в том, что tabsRendered является несвязанным .С Prototype вам придется связывать анонимные функции, используя bind().После // init code do:

if (Object.isFunction(this.options.tabsRendered))
  this.options.tabsRendered = this.options.tabsRendered.bind(this);

После этого вы можете вызвать this.options.tabsRendered(), и внутри этой некогда анонимной функции this будет ссылаться на нужный объект.Для получения подробной информации о связывании см. Документация по API прототипа .

РЕДАКТИРОВАТЬ: Как прокомментировано: верно, что анонимные функции затрагиваются не только.Это this из области, из которой была определена функция .

...