处理聚合物元素遗传的最佳方法

时间:2014-07-13 16:09:26

标签: javascript html css polymer web-component

给出如下元素:

<polymer-element name="custom-element">
    <template>
        <style>
            #container {
                color: red;
            }
        </style>
        <div id="container" on-click="{{clickContainer}}">
            ... lots of other stuff here ...
        </div>
    </template>
    <script>
        Polymer('custom-element', {
            clickContainer: function() {

            }
        });
    </script>
</polymer-element>

我想要另一个包装第一个的元素:

<polymer-element name="my-custom-element" extends="custom-element">
    <!-- extra styling -->
    <script>
        Polymer('my-custom-element', {
            clickContainer: function() {
                this.super();
            }
        });
    </script>
</polymer-element>

我的问题:

  • 指定其他样式的最佳方法是什么?
  • 我可以将基本元素包装在额外的标记中(比如另一个容器)吗?
  • 我可以从基本元素中选择元素吗?像<content select=".stuff">这样的东西,但是对于基础的阴影标记。

1 个答案:

答案 0 :(得分:12)

  
      
  • 指定其他样式的最佳方式是什么?
  •   
  1. 像往常一样将模板放在子类(my-custom-element)中。
  2. 在您希望显示超类模板的位置包含<shadow></shadow>元素。
  3. 将样式标记放入新模板。
  4. 要设置来自超类模板的元素的样式,请使用如下选择器:
  5. :host::shadow .someclass { ... }

    见下面的例子。

      
        
    • 我可以将基本元素包装在额外的标记中(比如另一个容器)吗?
    •   

    是的,您可以在<shadow></shadow>附近放置任何标记。

    <div>
      <shadow></shadow>
    </div>
    
      
        
    • 我可以从基本元素中选择元素吗?像<content select=".stuff">这样的东西,但是对于基础的阴影标记。
    •   

    没有。你不能那样投射(它是所有其他投影中的反向)。

    如果你真的想要从较旧的阴影根中挑选节点,可以通过直接从this.shadowRoot.olderShadowRoot拉出节点来在代码中完成。但这可能很棘手,因为超类可能对结构抱有期望。

    示例代码:

    <polymer-element name="my-custom-element" extends="custom-element">
    <template>
    
      <style>
          /* note that :host::shadow rules apply 
             to all shadow-roots in this element,
             including this one */
          :host::shadow #container { 
            color: blue;
          }
          :host {
            /* older shadow-roots can inherit inheritable 
               styles like font-family */
            font-family: sans-serif;
          }
      </style>
      <p>
        <shadow></shadow>
      </p>
    
    </template>
    <script>
    
      Polymer('my-custom-element', {
        clickContainer: function() {
          this.super();
        }
      });
    
    </script>
    </polymer-element>
    

    ProTips:

    • olderShadowRoot将存在,无论您是否包含<shadow></shadow>标记,但除非您这样做,否则它不会成为渲染DOM的一部分。
    • 要阻止olderShadowRoot(s)创建,您可以覆盖parseDeclarationssource)。 parseDeclarationsparseDeclarationfetchTemplate中的任何一种都可以覆盖各种效果。