Polymer:创建一个 "general" 自定义元素

Polymer: Create a "general" custom element

我正在尝试构建一个具有属性的元素,这些属性将指定应由哪个元素代替该元素。

我有一个 3d 卡片翻转元素,我在 index.html 中用于此目的,定义为:

<html>
    <head>
        <script src="bower_components/webcomponentsjs/webcomponents.js">
        </script>
        <link rel="import" href="elements/general-element.html">
    </head>
    <body>
        <general-element 
            name="card-flip" 
            address="elements/card-flip.html">
            <front>
                FRONT
            </front>
            <back>
                BACK
            </back>
        </general-element>
    </body>
</html>

一般-element.html定义在这里:

<link rel="import" 
    href="../bower_components/polymer/polymer.html">
<polymer-element name="general-element" attributes="name address">
    <template>
        <div id="element_here">
        </div>
    </template>
    <script>

      function addElementToDOM( element_name, _that ) {
          var elem = _that.shadowRoot.querySelector( "#element_here" );
          add_elem = document.createElement( element_name );
          elem.appendChild( add_elem );
      }

        Polymer ( 'general-element', {
          ready: function() {
              if ( 
                  ( this.address != undefined ) && 
                  ( this.name != undefined ) ) {

                  Polymer.import( 
                      [this.address], 
                      addElementToDOM( this.name, this )
                  );
              }
          }
        } );
    </script>
</polymer-element>

警告:输出为空白,控制台中显示错误 在 Polymer 升级元素之前,card-flip 上的属性是数据绑定的。这可能会导致绑定类型不正确。

这可以通过任何方式实现吗?

很难说你想要达到什么目的,但我会指出你的代码中的一些小问题,并提供工作版本 paper-button 而不是 flip-card (因为我没有代码flip-card.)

TL;DR 实时预览:http://plnkr.co/edit/yO865EkclZAsWBhzVSU4?p=preview

  1. 您的代码的主要问题是您调用了函数 addElementToDOM,而不是按照 Polymer.import 的请求将其作为回调传递。 function() { addElementToDOM(...); } 可以。

  2. 您对自定义元素使用无连字符的名称(如 frontback),这在传统上是被禁止的。请像我的示例一样使用虚线。

  3. 你的函数无缘无故地污染了全局 space。我把它放在一个元素里面。

  4. 您可能想将自定义 flip-card 放在 frontback 之间,但没有 content select='front/back' 标签的痕迹 在你的模板中。

  5. 您试图以不正确的方式访问 shadowRoot。您可能想看看 getDistributedNodes 函数,但在这种情况下,使用命名约定并简单地通过 this.$.elementHere.

  6. 来寻址元素会更容易
  7. 您应该明确指定 <body unresolved> 以便 polyfill 处理未解决的问题。

工作代码:

<!doctype html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
  <title>Add paper button</title>
  <script src="https://www.polymer-project.org/components/webcomponentsjs/webcomponents.js"></script>
  <link href="https://www.polymer-project.org/components/polymer/polymer.html" rel="import"> 
</head>

<body unresolved>
  <polymer-element name="general-element" attributes="name address">
    <template>
      <content select='my-front'></content>
      <div id="elementHere">
      </div>
      <content select='my-back'></content>
    </template>
    <script>
      Polymer ({
        addElementToDOM: function ( element_name ) {
          var elem = this.$.elementHere;
          add_elem = document.createElement( element_name );
          add_elem.appendChild(document.createTextNode('¡Hola!'));
          elem.appendChild( add_elem );
        },

        domReady: function() {
          if ( this.address && this.name ) {
            var self = this;
            Polymer.import( 
              [self.address], 
              function() { self.addElementToDOM( self.name ); }
            );
          }
        }
      });
    </script>
  </polymer-element>
  <general-element 
      name="paper-button" 
      address="https://www.polymer-project.org/components/paper-button/paper-button.html">
      <my-front>
          FRONT
      </my-front>
      <my-back>
          BACK
      </my-back>
  </general-element>
</body>
</html>

我敢打赌,您的代码可以通过应用修复 #1 来工作,但我强烈建议您也修复其他故障。希望对你有帮助。

P.S. 为什么你需要动态导入你的元素? simple

有什么问题
    <template>
      <content select='my-front'></content>
 <!-- ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓ -->
      <flip-card></flip-card>
      <content select='my-back'></content>
    </template>