firefox sdk:如何在侧边栏外部使用emit

gb5*_*256 3 javascript firefox firefox-addon firefox-sidebar firefox-addon-sdk

我正在使用SDK Tutorial网站中的代码:

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");
    });
 }
});
Run Code Online (Sandbox Code Playgroud)

这非常有效.现在的问题是,这只允许我通过work.port onAttach发送一些东西(以及侧栏上的3个其他事件).我需要的是使用此侧栏范围之外的emit函数.例如,如果我在同一个main.js中使用一个类似于标签的监听器

tabs.on('ready', function(tab) {
    sidebar.worker.port.emit("init", "message from main.js");
}
Run Code Online (Sandbox Code Playgroud)

这不起作用.我也试过了

 sidebar.port.emit("init", "message from main.js");
Run Code Online (Sandbox Code Playgroud)

要么

 worker.port.emit("init", "message from main.js");    
Run Code Online (Sandbox Code Playgroud)

没有成功.

我也尝试将标签监听器放在侧边栏的onAttach中(所以监听器内部是一个监听器),但这也无效.

有人对那个有想法吗?谢谢.

eri*_*old 5

使用此处描述的方法:

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);
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

然后在打开的侧边栏上发出:

workers.forEach(worker => {
  worker.port.emit('some-message', data);
})
Run Code Online (Sandbox Code Playgroud)