Полезная информация

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

Разработка » Как указать scope при назначении обработчика tabs.on('open', handler)? » 12-07-2015 08:43:31

Infocatcher пишет

видимо, предполагается использовать так:

Выделить код

Код:

require('sdk/tabs').on('open', путьКМетодуВОбъектеОбкртке.handlerOpen.bind(путьКМетодуВОбъектеОбкртке));

Не понял строку кода.  путьКМетодуВОбъектеОбкртке.handlerOpen.bind(путьКМетодуВОбъектеОбкртке)
Mozilla добавляет к любой функции JS метод bind чтобы можно было указать контекст, в котором эта функция выполняется?

Выделить код

Код:

// Что-то типа:
myAddon = {
  handlerTabsOpen : function() {
  },
  run : function() {
    require('sdk/tabs').on('open', this.handlerTabsOpen.bind(this));
  }
}
myAddon.run();

PS:
Нагуглил. Этот метод является встроенным в современном JS.
javascript.ru : https://learn.javascript.ru/bind#bind
MDN : https://developer.mozilla.org/en-US/doc … ction/bind
Infocatcher, спасибо огромное.
Самое обидное, что проходил курс javascript.ru три года назад, но многое вылетело из головы :(

Разработка » Как указать scope при назначении обработчика tabs.on('open', handler)? » 11-07-2015 14:01:35

1. Привязываем функцию к коллекции табов.

Выделить код

Код:

require('sdk/tabs').on('open', путьКМетодуВОбъектеОбкртке.handlerOpen);

2. В функции handlerOpen привязываем события к новому tab-у.

Выделить код

Код:

handlerOpen : function(tab) {
  // Тут мы потеряли ОбъектОбертку
  tab.on('pageshow', this.tab.pageshow);
  tab.on('activate', this.tab.activate);
}

Я могу завернуть код в анонимную функцию, но это некрасивое решение

Выделить код

Код:

handlerOpen : function(tab) {
  // Тут мы потеряли ОбъектОбертку
  (function(){
    // Тут мы переустановили this
    tab.on('pageshow', this.tab.pageshow);
    tab.on('activate', this.tab.activate);
  }).call(zimMain.tabs.handlers);
}

См. строку: // this ===  require('sdk/tabs'), а ожидается "zimMain.tabs.handlers"
в методе zimMain.tabs.handlers.open
Тестовый код main.js:
[code]
console.log('main.js', 'BEG');

var zimMain = {
    /**
     * Контейнер для инклуда элементов SDK
     */
    sdk : {
        tabs : require('sdk/tabs'),
        contextMenu : require

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]