在全球范围内收听所有铁信号

Listen globally for all iron-signals

有什么方法可以拦截所有 iron-signals 正在发送 而无需 在 iron-signals 侦听器中明确指定它们的名称?

用例

当前实施

我在我的应用程序中发射铁信号以促进我的不同元素之间的通信,如下所示:

// throughout the app
this.fire("iron-signal", {name: "do-foo"});
this.fire("iron-signal", {name: "do-bar"});
this.fire("iron-signal", {name: "do-baz"});

现在我想要另一个元素,我们称它为 analytics-tracker.html 以拦截所有 <iron-signal> 被触发。这是一个天真的解决方案:

// in analytics-tracker.html
<iron-signals on-iron-signal-do-foo="trackEvent"></iron-signals>
<iron-signals on-iron-signal-do-bar="trackEvent"></iron-signals>
<iron-signals on-iron-signal-do-baz="trackEvent"></iron-signals>

为每个事件添加一个 <iron-signals> 元素很快就会变得难以管理。

可能的解决方案

我可能 "bundle" 所有事件都作为一个命名空间事件,可以像这样跟踪:

// throughout the app
this.fire("iron-signal", {name: "general-event", data: { type: "Do Foo"}});
this.fire("iron-signal", {name: "general-event", data: { type: "Do Bar"}});
this.fire("iron-signal", {name: "general-event", data: { type: "Do Baz"}});

// in analytics-tracker.html
<iron-signals on-iron-signal-general-event="trackEvent"></iron-signals>

理想的解决方案

例如:

// throughout the app
this.fire("iron-signal", {name: "do-foo"});
this.fire("iron-signal", {name: "do-bar"});
this.fire("iron-signal", {name: "do-baz"});

// in analytics-tracker.html
<iron-signals on-iron-signal-*="trackEvent"></iron-signals>

有什么办法可以做到类似于理想的解决方案吗?

我认为你可以为此创建一个事件侦听器,这是最简单的解决方案:

// ...
ready: function()
{
    // signal listener at document
    document.addEventListener('iron-signal', event => {
       this.trackEvent( event.detail );
    });
}
// ...

iron-signals 正在侦听文档中的全局 CustomEvent,其中 event.detail 具有 namedata 值,然后 iron-signals 元素调度基于名称的事件在通知方法中。