3

我正在使用 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 个事件)。我需要的是在此侧边栏范围之外使用发出功能。例如,如果我在同一个 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 中(因此侦听器内部的侦听器),但这也不起作用。

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

4

1 回答 1

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

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

workers.forEach(worker => {
  worker.port.emit('some-message', data);
})
于 2014-03-18T02:00:15.377 回答