Javascript FirefoxSDK:如何在widget外部使用emit作为边栏

Javascript FirefoxSDK:如何在widget外部使用emit作为边栏,javascript,firefox,firefox-addon,firefox-addon-sdk,firefox-sidebar,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,Firefox Sidebar,我使用的代码来自SDK教程网站: var sidebar = require("sdk/ui/sidebar").Sidebar({ id: 'my-sidebar', title: 'My Sidebar', url: require("sdk/self").data.url("sidebar.html"), onAttach: function (worker) { // listen for a "ready" message from the

我使用的代码来自SDK教程网站:

var sidebar = require("sdk/ui/sidebar").Sidebar({
    id: 'my-sidebar',
    title: 'My Sidebar',
    url: require("sdk/self").data.url("sidebar.html"),
    onAttach: function (worker) {
       // listen for a "ready" message from the script
       worker.port.on("ready", function() {
       // send an "init" message to the script
       worker.port.emit("init", "message from main.js");
    });
 }
});
这很有效。现在的问题是,这只允许我通过worker.port-onAttach(以及侧栏的3个其他事件)发送一些内容。 我需要的是在这个侧边栏的范围之外使用emit函数。例如,如果我在同一个main.js中使用一个侦听器

tabs.on('ready', function(tab) {
    sidebar.worker.port.emit("init", "message from main.js");
}
这是行不通的。我也试过了

 sidebar.port.emit("init", "message from main.js");

没有成功

我还尝试将tab listener放在侧边栏的onAttach中(因此listener放在listener中),但这也不起作用

有人对此有想法吗? 谢谢。

然后,要在打开的侧栏上发射,请执行以下操作:

workers.forEach(worker => {
  worker.port.emit('some-message', data);
})

另一种选择是:从侧边栏发送自定义事件@诺伊蒂达特,谢谢你的建议。我已经尝试过了,但是唯一可以使用的事件是sidebar.attach。但这一事件不能从外部引发。所以我现在使用了sidebar.show,它似乎触发了sidebar.attach。因此,每当选项卡更改时,侧边栏将重新加载,但它正在执行我想要的操作。不是最优的解决方案,而是快速而肮脏的解决方案。谢谢你的回复。我对SDK了解不多,所以不要认为我的回复是唯一可能的解决方案。如果你去了,让我知道我可以帮你。下面是一个阅读制作的例子,介绍了如何在boostrap中创建边栏:啊,现在我知道为什么我对你的名字很熟悉了。几天前,当我开始开发侧边栏时,我确实偶然发现了你的bootstrap.js。当我在sdk中遇到越来越多的限制时,我将尝试一下您的文件,看看它是如何工作的。再次感谢。哈哈,很酷的人,我很高兴听到人们看到我的教程,我希望他们能帮助我。如果你需要帮助,请告诉我。SDK有一些非常严格的限制,我试图通过破解一些东西来帮助人们克服这些限制,但遇到了一些我无法解释的东西。我发布了关于它的文章,我听说没有太多人知道SDK的内部工作原理。这是有可能的,但要想在bootstrap中实现如此简单的功能,需要进行大量的挖掘。(示例主题:)回答得很好!我尝试在闭包中使用绑定(我只有一个侧边栏),但我猜工作人员改变了或者类似的事情。
var workers = [];

function detachWorker(worker, workerArray) {
  var index = workerArray.indexOf(worker);
  if(index != -1) {
    workerArray.splice(index, 1);
  }
}

var sidebar = require("sdk/ui/sidebar").Sidebar({
  ...
  onAttach: function(worker) {
    workers.push(worker);
    worker.on('detach', function () {
      detachWorker(this, workers);
    });
  }
});
workers.forEach(worker => {
  worker.port.emit('some-message', data);
})