将函数定义为对象参数

时间:2014-08-29 14:38:52

标签: javascript firefox-addon-sdk

我正在使用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导入main.jsvar utils = require(utils);两个文件位于同一位置:[ROOT]/lib

但是因为这行而遇到错误:_ : require('sdk/l10n').get, _不是函数。 我尝试用这种方式编写它:_ : require('sdk/l10n').get(),get(str),但它们都失败了,第一次因为get需要一个参数,第二次因为str没有定义。有没有办法定义这个项目?

[编辑]:经过多次尝试后,我发现用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}})...

1 个答案:

答案 0 :(得分:0)

我明白了。

main.js是 - 按其名称 - 主要元素,因此必须在内部完成任何在外部完成的操作。对于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的底部执行。