在子聚合物元素之间通信和传递数据的最佳方式是什么?

What is the best way to communicate and pass data between child polymer elements?

我有一个父聚合物元素 baseline-policies-tab。这在 UI 上表示我网站上的一个选项卡。在此选项卡中,我有两个聚合物元素。一个是 baseline-policies-create,这是一个带有按钮的聚合物元素。按下此按钮时,我想将事件发送到选项卡 baseline-policy-ajax 中包含的另一个子聚合物元素。此元素将发送 ajax 请求。

我已经通过发送 CustomEvent 来尝试 dispatchEvent,但它对我不起作用(这是我发布的关于此的问题:Why doesn't element catch event when using dispatchEvent from sibling polymer element?

那么有没有另一种不使用事件在元素之间进行通信的方法?

polymer中主要有两种通信方式

1.数据绑定

Polymer 实现双向数据绑定。如果您在 Polymer 元素内部工作并希望通过 public properties

将“link”元素组合在一起,则此方法很有用

<dom-module id="my-model">
  <script>
    class MyModel extends Polymer.Element {
      static get is() {
        return 'my-model';
      }

      static get properties() {
        return {
          items: {
            type: Array,
            value: ['item1', 'item2']
          }
        };
      }
    }

    window.customElements.define(MyModel.is, MyModel);
  </script>
</dom-module>

<dom-module id="my-app">
  <template>
    <my-model items="{{list}}"></my-model>
    <template is="dom-repeat" items="{{list}}">
        <div>{{item}}</div>
    </template>
  </template>
  <script>
    class MyApp extends Polymer.Element {
      static get is() {
        return 'my-app';
      }

      static get properties() {
        return {
          list: {
            type: Array,
          }
        };
      }
    }
    window.customElements.define(MyApp.is, MyApp);
  </script>
</dom-module>

2。自定义事件

此方法适用于 Polymer 元素内部和外部的元素。其他元素可以侦听所述事件并做出相应响应。

<dom-module id="my-element">
  <script>
    class MyElement extends Polymer.Element {
      static get is() {
        return 'my-element';
      }

      sayHI() {

        let evt = new CustomEvent('my-element-say-hi', {
          detail: {
            message: 'hi'
          },
          bubbles: true,
          composed: true
        });
        window.dispatchEvent(evt);

        return 'Hi';

      }
    }

    window.customElements.define(MyModel.is, MyModel);
  </script>
</dom-module>

<dom-module id="my-app">
  <template>
    <my-element id="el"></my-element>
  </template>
  <script>
    class MyApp extends Polymer.Element {
      static get is() {
        return 'my-app';
      }

      ready() {
        super.ready();
        Polymer.RenderStatus.afterNextRender(this, function() {
          window.addEventListener('my-element-say-hi', e => { /* do something */ });
        });

        this.$.el.sayHI();
      }
    }
    window.customElements.define(MyApp.is, MyApp);
  </script>
</dom-module>

Polymer 2 中的通信有点棘手,因为 Fakher 先生已经说过您可以使用 Databinding,它只有在您的组件处于直接父子关系中时才有效。

您也可以使用自定义事件,但是您会遇到这样的问题,即您的交流只会向上 dom 树,这可能不是您要找的东西。

在这些情况下倾向于使用的是 prims-event-bus