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
您的代码的主要问题是您调用了函数 addElementToDOM
,而不是按照 Polymer.import
的请求将其作为回调传递。 function() { addElementToDOM(...); }
可以。
您对自定义元素使用无连字符的名称(如 front
和 back
),这在传统上是被禁止的。请像我的示例一样使用虚线。
你的函数无缘无故地污染了全局 space。我把它放在一个元素里面。
您可能想将自定义 flip-card
放在 front
和 back
之间,但没有 content select='front/back'
标签的痕迹
在你的模板中。
您试图以不正确的方式访问 shadowRoot
。您可能想看看 getDistributedNodes
函数,但在这种情况下,使用命名约定并简单地通过 this.$.elementHere
.
来寻址元素会更容易
您应该明确指定 <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>
我正在尝试构建一个具有属性的元素,这些属性将指定应由哪个元素代替该元素。
我有一个 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
您的代码的主要问题是您调用了函数
addElementToDOM
,而不是按照Polymer.import
的请求将其作为回调传递。function() { addElementToDOM(...); }
可以。您对自定义元素使用无连字符的名称(如
front
和back
),这在传统上是被禁止的。请像我的示例一样使用虚线。你的函数无缘无故地污染了全局 space。我把它放在一个元素里面。
您可能想将自定义
flip-card
放在front
和back
之间,但没有content select='front/back'
标签的痕迹 在你的模板中。您试图以不正确的方式访问
shadowRoot
。您可能想看看getDistributedNodes
函数,但在这种情况下,使用命名约定并简单地通过this.$.elementHere
. 来寻址元素会更容易
您应该明确指定
<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>