2012-01-04 6 views
8

मैं एक विस्तार विकसित करने के लिए नए फ़ायरफ़ॉक्स एडॉन्स एसडीके का उपयोग कर रहा हूं। मेरे पास एक पैनल संलग्न है, जिसमें एक पैनल संलग्न है। पैनल को प्राथमिकताओं को नियंत्रित करने के लिए उपयोग किया जाता है, इसलिए मुझे पैनल की सामग्री स्क्रिप्ट से सरल-संग्रहण एपीआई तक पहुंचने की आवश्यकता है। मुझे पता है कि आप सीधे एपीआई तक नहीं पहुंच सकते हैं, इसलिए मैंने संदेश पास करने का प्रयास किया है। यहाँ मैं क्या मिल गया है:फ़ायरफ़ॉक्स एडॉन्स एसडीके - सामग्री स्क्रिप्ट से सरल संग्रहण तक कैसे पहुंचे?

exports.main = function() { 
    var panel = require('panel'); 
    var ss = require('simple-storage'); 

    var prefPanel = panel.Panel({ 
     contentURL: self.data.url('prefPanel.html'), 
     contentScriptFile: self.data.url('prefPanel.js'), 
     contentScriptWhen: 'ready', 
     onMessage: function(message) { 
      switch(message.method) { 
       case 'setValue': 
        ss.storage[message.key] = message.value; 
      } 
     }, 
    }); 

    prefPanel.postMessage(ss.storage); 


    require('widget').Widget({ 
     id: 'ml-pref-button', 
     content: 'ML', 
     width: 30, 
     panel: prefPanel, 
    }) 
} 

और prefPanel.js में मुझे मिल गया है:

Error: An exception occurred. 
Traceback (most recent call last): 
    File "resource://jid0-wdemwzahwzh3bsw0kkxlcjg9e7k-at-jetpack-api-utils-lib/content/worker.js", line 405, in postMessage 
    throw new Error(ERR_DESTROYED); 
Error: The page has been destroyed and can no longer be used. 

मुझे लगता है कि लगता है:

self.on('message', function(storage) { 

    storage.setValue = function(key, value) { 
     this[key] = value; 
     self.postMessage({ 
      method: 'setValue', 
      'key': key, 
      'value': value, 
     }); 
    } 

    // Do some stuff, using storage object 

}); 

समस्या है, मैं इस त्रुटि मिलती है ऐसा इसलिए है क्योंकि prefPanel DOM और सामग्री स्क्रिप्ट अभी तक लोड नहीं हुई हैं। क्या पैनल दिखाए जाने पर हर बार डीओएम और सामग्री स्क्रिप्ट पुनः लोड हो जाती हैं, या वे हमेशा पृष्ठभूमि में चल रहे हैं?

उत्तर

3

हाँ, मुझे लगता है कि जब भी पैनल दिखाया जाता है तो डोम और सामग्री स्क्रिप्ट को फिर से लोड किया जाता है (आप आसानी से जांच सकते हैं कि यह सही है या नहीं, बस console.log("loaded") अपनी सामग्री स्क्रिप्ट में कॉल करें)। तो पैनल को दिखाए जाने पर आपको बस अपना संदेश भेजना चाहिए:

var prefPanel = panel.Panel({ 
    contentURL: self.data.url('prefPanel.html'), 
    contentScriptFile: self.data.url('prefPanel.js'), 
    contentScriptWhen: 'ready', 
    onMessage: function(message) { 
     switch(message.method) { 
      case 'setValue': 
       ss.storage[message.key] = message.value; 
     } 
    }, 
    onShow: function() { 
     prefPanel.sendMessage(ss.storage); 
    } 
}); 
संबंधित मुद्दे