javascript - Polymer 2 中的模板,如何获取槽元素的上下文?

标签 javascript polymer shadow-dom

有什么方法可以从 slot'ed 元素执行方法吗?我正在创建一个包含保存按钮的模板。理想情况下,当单击模板自己的保存按钮时,模板应调用开槽内容(子级).save 方法。关于如何实现这一目标有什么想法吗?

我尝试了以下模板:

<dom-module id="template-action-bar">
  <template>
    <style include="granite-bootstrap"></style>

    <slot id="slot"></slot> 

    <div class="container flex-end-justified">
      <button
       hidden$=[[_isNotFn('next')]]
       disabled$="[[!valid]]"
       class="btn btn-primary"
       on-click="_next"
      >
        Next (Save)
      </button>

      <button
        hidden$=[[_isNotFn('back')]]
        disabled$="[[!valid]]"
        class="btn btn-primary"
        on-click="_back"
      >
        Back (Undo)
      </button>
   </div>
</template>
    <script>
    class TemplateActionBar extends Organism {
      static get is() {
        return 'template-action-bar';
      }

      static get properties() {
        return {
          next: Function,
          back: String
        };
      }

      _isNotFn(fn) {
        return this[fn] !== 'function';
      }

      _next() {
        this.next();
      }

      _back() {
        this.$.slot.undo();
      }
    }

    window.customElements.define(TemplateActionBar.is, TemplateActionBar);
    </script>

以及元素(它的简短版本):

<dom-module id="element-creation">
  <template>
    <template-action-bar
      next="{{ save }}"
    >
    <!-- ....... -->
  </template>

  <script>
  class ElementCreation extends Organism {
    /* ****************** */

    save() {
      // FIRST ATTEMPT
      console.log(this); // <- I want the scope of ElementCreation not template-action-bar
    }

    save() {
      // SECOND TRY
      return (function() {
        console.log(this); // <- I want the scope of ElementCreation not template-action-bar
      }());
    }
  }
  window.customElements.define(ElementCreation.is, ElementCreation);
  </script>
</dom-module>

最佳答案

由于您可以插入任何元素,甚至是没有 save 方法的元素,IMO 这不是实现此目的的正确方法。 polymer 严重依赖介体模式。相反,您应该在单击“保存”按钮时触发一个事件,并在中介器(即使用槽实例化元素和槽元素的组件)中对该事件执行操作。

class ElementWithSlots {
  ...
  onSaveTap_(event) {
    this.dispatchEvent(new CustomEvent('saved', {bubbles: false}));
  }
}

然后,在你的中介中:

<element-with-slots on-saved="onSavedEvent_">
  <slotted-element id="slotted" slot="foo"></slotted-element>
</element-with-slots>

在你的中介JS中:

onSavedEvent_ {
  this.$.slotted.actOnSave();
}

关于javascript - Polymer 2 中的模板,如何获取槽元素的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45985516/

相关文章:

google-chrome - 如何关闭 Chrome 控制台中的/deep/组合器弃用警告?

javascript - JavaScript 中的 Return 语句未返回正确的值

javascript - 如何在 Polymer 中使用 google-map-directions 元素?

css - 像 normalize.css 这样的 CSS 重置会传播到 shadow dom 吗?

javascript - 如何调用其他元素的方法?

data-binding - 如何在 polymer 中与 meteor 进行数据绑定(bind)

dart - 如何在 Dart 中以编程方式创建 Shadow DOM?

javascript - 如何将 Javascript 对象转换为 Node 缓冲区?

javascript - 使用 jQuery .html 插入 javascript

javascript - 检查字符串是否包含与正则表达式匹配的子字符串