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

时间:2014-03-14 15:32:36

标签: 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 script
       worker.port.on("ready", function() {
       // send an "init" message to the script
       worker.port.emit("init", "message from main.js");
    });
 }
});

这很有效。现在的问题是,这只允许我通过work.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");

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

没有成功。

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

有人对此有所了解吗? 感谢。

1 个答案:

答案 0 :(得分:5)

Use the method described here

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);
})