2014-08-29 2 views
1

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

Прямо сейчас, у меня есть utils.js, который выглядит следующим образом:

'use strict'; 

module.exports.utils = function() { 
    return { 
    _   : require('sdk/l10n').get, 
    self  : require('sdk/self'), 
    sStorage : require('sdk/simple-storage'), 
    tabs  : require('sdk/tabs'), 
    pageMod  : require('sdk/page-mod'), 
    toggleButton: require('sdk/ui/button/toggle'), 
    panel  : require('sdk/panel'), 
    hotkey  : require('sdk/hotkeys'), 
    displayPanel: function(mainPanel, qwantButton) { 
     if (mainPanel.isShowing) { 
     mainPanel.hide(); 
     qwantButton.state('window', { 
      checked: false 
     }); 
     } else { 
     mainPanel.show({ 
      position: qwantButton 
     }); 
     } 
    } 
    }; 
}(); 

я импортировать utils.js Into main.js таким образом: var utils = require(utils); оба файла находящегося в том же месте: [ROOT]/lib.

Но я столкнулся с ошибкой из-за этой строки: _ : require('sdk/l10n').get, для _ не являющейся функцией. Я пробовал написать его так: _ : require('sdk/l10n').get(), или с get(str), но они оба терпят неудачу, первый раз, потому что get нуждается в аргументе, второй раз, потому что str не определена. Есть ли способ определить этот элемент?

[EDIT]: С еще несколько попыток, я узнал, что написание utils.js таким образом сделал _ работы:

'use strict'; 

var _   = require('sdk/l10n').get, 
    self   = require('sdk/self'), 
    sStorage  = require('sdk/simple-storage'), 
    tabs   = require('sdk/tabs'), 
    {PageMode} = require('sdk/page-mod'), 
    {ToggleButton}= require('sdk/ui/button/toggle'), 
    {Panel}  = require('sdk/panel'), 
    {Hotkey}  = require('sdk/hotkeys'); 

var qwantButton = new ToggleButton({ 
    id: 'toolbar_button_id', 
    label: _('toolbar_button_label'), 
    icon: { 
    '16': './img/logo-16.png', 
    '32': './img/logo-32.png', 
    '64': './img/logo-64.png' 
    }, 
    onClick: displayMainPanel 
}); 

var mainPanel = new Panel({ 
    width: 525, 
    height: 175, 
    contentURL: self.data.url('./panel.html'), 
    contentScriptFile: self.data.url('./js/panelScript.js') 
}); 

var hotkey = new Hotkey({ 
    combo: 'alt-Q', 
    onPress: displayMainPanel(qwantButton, mainPanel) 
}); 

function displayMainPanel(mainPanel, qwantButton) { 
    if (mainPanel.isShowing) { 
    mainPanel.hide(); 
    qwantButton.state('window', { 
     checked: false 
    }); 
    } else { 
    mainPanel.show({ 
     position: qwantButton 
    }); 
    } 
} 

module.exports = function utils() { 
    return { 
    _   : _, 
    self  : self, 
    sStorage : sStorage, 
    tabs  : tabs, 
    hotkey  : hotkey, 
    qwantButton : qwantButton, 
    mainPanel : mainPanel, 
    displayMainPanel: displayMainPanel 
    }; 
}(); 

Но теперь, методы обязательных элементов не работают (например, mainPanel.show()). ..

+1

Где вы действительно получаете ошибку - при оценке 'require ('sdk/l10n'). Get' или при вызове метода' utils ._() '? – Bergi

+0

При вызове 'utils ._()'. – ss814

+0

Ну, если он говорит, что '_' не является функцией, вы не можете его назвать. Скажите, действительно ли skd/l10n действительно экспортирует метод get. – Bergi

ответ

0

У меня есть.

main.js есть -as per it's name - главный элемент, поэтому внутри нужно что-либо сделать снаружи. Для функций SDK, я сделал это:

main.js:

'use strict'; 

var Core = function() { 
    var _   = require('sdk/l10n'), 
    self  = require('sdk/self'), 
    sPrefs  = require('sdk/simple-prefs'), 
    sStorage = require('sdk/simple-storage'), 
    tabs  = require('sdk/tabs'), 
    hotkey  = require('sdk/hotkeys'), 
    pageMod  = require('sdk/page-mod'), 
    panel  = require('sdk/panel'), 
    toggleButton= require('sdk/ui/button/toggle'); 

    return { 
    _    : _, 
    self   : self, 
    sPrefs   : sPrefs, 
    sStorage  : sStorage, 
    tabs   : tabs, 
    hotkey   : hotkey, 
    pageMod   : pageMod, 
    panel   : panel, 
    toggleButton : toggleButton 
    }; 
}; 

module.exports = Core; 

var Interface = require('interface'); 

var qwantInterface = new Interface(); 

Таким образом, весь SDK инкапсулируется в функции Core, которую я экспорта. Теперь для каждого другого файла потребуется main.js и получить Core. Например, the interface.js:

'use strict'; 

var Core = require('main'); 

var core = new Core(); 

var Interface = function() { 
    var qButton = core.toggleButton.ToggleButton({ 
    id: 'toolbar_button_id', 
    label: core._.get('toolbar_button_label'), 
    icon: { 
     '16': './img/logo-16.png', 
     '32': './img/logo-32.png', 
     '64': './img/logo-64.png' 
    }, 
    onClick: displayPanel 
    }), 
    qPopup  = core.panel.Panel({ 
    width: 525, 
    height: 175, 
    contentURL: core.self.data.url('popup.html'), 
    contentScriptFile: core.self.data.url('./js/popupScript.js') 
    }), 
    qHotkey  = core.hotkey.Hotkey({ 
    combo: 'alt-Q', 
    onPress: displayPanel 
    }); 

    function displayPanel() { 
    if (qPopup.isShowing) { 
     qPopup.hide(); 
     qButton.state('window', { 
     checked: false 
     }); 
    } else { 
     qPopup.show({ 
     position: qButton 
     }); 
    } 
    } 
}; 

module.exports = Interface; 

И теперь, Interface экспортируется требуется и выполняется в нижней части main.js, как предполагалось.

Смежные вопросы