2014-08-29 64 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.jsmain.js這樣:var utils = require(utils);兩個文件在同一位置是:[ROOT]/lib

但我遇到了一個錯誤,因爲這條線:_ : require('sdk/l10n').get,爲_不是一個函數。 我試過這樣寫:_ : require('sdk/l10n').get(),get(str),但它們都失敗了,第一次因爲得到需要一個參數,第二次因爲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

在評估require('sdk/l10n')。get'時,或者在調用utils ._()'方法時,您真的會得到哪些錯誤? – Bergi 2014-08-29 14:48:10

+0

調用'utils ._()'時。 – ss814 2014-08-29 16:09:57

+0

那麼,如果它說'_'不是一個函數,那麼你就不能調用它。 Theck skd/l10n是否真的導出了一個'get'方法。 – Bergi 2014-08-29 16:17:10

回答

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的底部執行。

相關問題