Как вы получаете доступ к экземпляру объекта во втором параметре функции Mootools fireEvent? - PullRequest
1 голос
/ 18 декабря 2011

Я работаю через Реализует: [События, Опции] в Mootools.

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

Я прокомментировал код ниже, где моя проблема. У меня есть ощущение, что это может быть связано с привязкой , поэтому сейчас я посмотрю на это. Заранее спасибо за любую помощь!

var Person = new Class({

    Implements: [Options, Events],

    initialize: function(options){
        this.setOptions(options);
    }

});

greet = function(name){
    log('Hello, I am ' + name);
}

var ryan = new Person({
    name: 'Ryan',
    onArrive: greet //add event 'arrive'
});
ryan.fireEvent('arrive', ryan.options.name); //ideally I would use this.options.name?

Этот код работает, но кажется странным использовать имя экземпляра объекта вместо , это в последней строке.

Ответы [ 2 ]

1 голос
/ 18 декабря 2011

Когда вы запускаете событие, это равно вашему экземпляру Райана.Чтобы это работало, просто внесите следующие изменения

function greet(name){
    log('Hello, I am ' + this.options.name); //<-- use this here 
}

ryan.fireEvent('arrive');

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

var Person = new Class({

    Implements: [Options, Events],

    initialize: function(options){
        this.setOptions(options);
    },
    greet: function() { log('Hello, I am ' + this.options.name); //<-- use this here  }
});

и

var ryan = new Person({
    name: 'Ryan',
    onArrive: this.greet.bind(this)  //or a function() { /* log('Hello,... */}
});
0 голосов
/ 18 декабря 2011

ключевое слово this относится к текущему объекту .В вашем случае this, вероятно, относится к глобальному объекту (окну).Вы должны находиться в области видимости ryan, чтобы вы могли ссылаться на ryan как this:

function fireEvent(e){
    this.fireEvent(e,this.options.name);
}
fireEvent.call(ryan,'arrive');  

Вы также можете перегрузить метод fireEvent, если не хотитеиспользуйте ссылку на тот же экземпляр снова.Примерно так:

var originalFireEvent = Person.prototype.fireEvent;
Person.prototype.fireEvent = function(e,o){
    var a = typeof this.options[o] !== 'undefined' ? this.options[o] : null;
    return originalFireEvent.call(this,e,a);
}

и затем назовите это так:

ryan.fireEvent('arrive','name');
...