3

SDK チュートリアル Web サイトの次のコードを使用しています。

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

また

 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 に答える