【问题标题】:Isolate polymer custom elements for use in others custom elements隔离聚合物自定义元素以用于其他自定义元素
【发布时间】:2014-06-11 19:25:02
【问题描述】:

是否可以确保某些自定义元素仅在特定自定义元素中可用?

例如,我创建了一个site-heading 和一个help-icon 元素。

<polymer-element name="site-heading">
    <template>
        <h1>
            <content></content>
            <content select="help-icon"></content>
        </h1>
    </template>
<polymer-element>

<polymer-element name="help-icon">
    <template>
        <span class="help">
            <img src="/image/help.png" />
            <content></content>
        </span>
    </template>
<polymer-element>

现在这不是最实际的例子,但是,假设help-icon 是一个高度专业化的元素,仅在site-heading 的上下文中才有意义。 如何强制该元素仅在 site-heading 内部使用?

耶!

<site-heading>
    Super Cool Site Header
    <help-icon>Help Me!</help-icon>
</site-heading>

不!

<help-icon>Help Me!</help-icon>

更新 2:@ebdel

似乎这种关系并没有得到真正的支持,甚至可能不在规范中。这是一个真实的案例,我认为考虑到范围内(孤立的?)元素应该很重要。

假设供应商将创建一个可交付的 Web 组件。例如,SoundCloud 将创建一个 &lt;soundcloud-player&gt; 元素。玩家需要一个曲目列表,因此他们创建了一个&lt;track-info attributes="track-id crop etc"&gt;{{HTML for description pane}}&lt;/track-info&gt; 元素。

&lt;track-info&gt; 元素仅作为&lt;soundcloud-player&gt; 的子元素有用:

  • 目前,理论上 &lt;track-info&gt; 完全没问题,直到新的 Web 组件定义了 &lt;track-info&gt; 元素。

  • 供应商可能创建的每个元素都以他们的名称为前缀真的有意义吗? IE。 &lt;soundcloud-track-info&gt;

我们是否应该将此对话转移到其他地方,因为我们似乎已经有了原始问题的答案?

【问题讨论】:

    标签: polymer web-component shadow-dom


    【解决方案1】:

    HTML 解析器只保留几个标签来表现这种行为(如果它们不在某个父级之下,它们将被忽略):

    • &lt;option&gt;/&lt;optgroup&gt; 只能用作&lt;select&gt; 的子级。
    • &lt;tr&gt; 只能是 &lt;table&gt; 的孩子
    • others

    我的第一个问题是help-icon 是否需要成为一个组件。组合是个好东西 :) 如果它现在对你有用,它可能在其他地方也有用。

    为了让这个工作......我会做你在site-header所做的事情。仅使用&lt;content select="help-icon"&gt;&lt;/content&gt; 选择&lt;help-icon&gt;。其次,您可以在domReady() 中测试该元素是哪个父元素的子元素:

    <polymer-element name="help-icon" hidden>
      <template>
        <content></content>
      </template>
      <script>
        Polymer('help-icon', {
          domReady: function() {
            // help-icon should only be a parent of site-banner.
            // Unhide
            if (this.parentNode.localName == 'site-banner') {
              this.hidden = false;
            } else {
              //this.remove(); // optionally remove it from the dom.
            }
          }
        });
      </script>
    </polymer-element>
    

    演示:http://jsbin.com/dazewiqa/1/edit

    【讨论】:

    • 谢谢。我在我的问题中添加了更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多