- Polymer 教程
- Polymer - 首页
- Polymer - 概述
- Polymer - 安装
- Polymer - 元素
- Polymer - 自定义元素
- Polymer - Shadow DOM 和样式
- Polymer - 事件
- Polymer - 数据系统
- Polymer 有用资源
- Polymer 快速指南
- Polymer - 有用资源
- Polymer - 讨论
Polymer 快速指南
Polymer - 概述
Polymer.js 是 Google 创建的一个 JavaScript 库,允许重用 HTML 元素来构建基于组件的应用程序。
Polymer 是一个由 Google 开发人员开发的开源 JavaScript 库,最初于 2015 年 5 月 27 日发布。稳定版本为 1.7.0,于 2016 年 9 月 29 日发布。
为什么要使用 Polymer.js?
它允许我们使用 HTML、CSS 和 JavaScript 轻松创建自己的自定义元素,为元素添加交互功能。
它由 Google 创建,提供与 Web 组件一起使用的跨浏览器兼容应用程序。
它提供单向和双向数据绑定。
它提供 Polymer 命令行界面,用于管理从简单组件到复杂 Web 应用程序的项目。
Polymer.js 的特性
它是一个基于 Web 标准 API 构建的 JavaScript 库,允许构建自定义 HTML 元素。
它提供 polyfills(Web 组件规范)用于创建我们自己的自定义和可重用元素。
它使用 Web 组件标准在 Web 文档和 Web 应用程序中创建可重用的部件。
它使用 Google Material Design 开发混合移动应用程序。
它通过网络分发自定义元素,用户可以使用 HTML Imports 来使用这些元素。
Polymer - 安装
在你的系统中配置 Polymer 很容易。以下是安装 Polymer 的两种方法。
- Polymer CLI(命令行界面)
- Bower
使用 Polymer CLI 安装 Polymer
步骤 1 - 使用以下 npm 命令安装 Polymer。
npm install -g polymer-cli@next
步骤 2 - 使用以下命令检查安装是否成功以及版本。
polymer --version
如果安装成功,则会显示版本为 -
步骤 3 - 创建一个你选择的名称的目录,并切换到该目录。
mkdir polymer-js cd polymer-js
步骤 4 - 要初始化你的项目,请在你的 *polymer-jsdirectory* 中运行以下命令。
polymer init
执行上述命令后,它将显示类似以下内容 -
C:\polymer-js>polymer init
? Which starter template would you like to use?
1) polymer-1-element - A simple Polymer 1.0 element template
2) polymer-2-element - A simple Polymer 2.0 element template
3) polymer-1-application - A simple Polymer 1.0 application template
4) polymer-2-application - A simple Polymer 2.0 application
5) polymer-1-starter-kit - A Polymer 1.x starter application template, with
navigation and "PRPL pattern" loading
6) polymer-2-starter-kit - A Polymer 2.x starter application template, with
navigation and "PRPL pattern" loading
7) shop - The "Shop" Progressive Web App demo
Answer: 4
步骤 5 - 从上面给出的选项中选择 polymer-2-application。
现在,使用以下命令启动你的项目。
polymer serve
使用 Bower 安装 Polymer
步骤 1 - 要使用 Bower 方法从头开始,请使用以下命令安装 Bower。
npm install -g bower
步骤 2 - 使用以下命令安装 Polymer。
npm install -g polymer-cli@next
步骤 3 - 使用以下命令检查 Polymer 的安装是否成功以及版本。
polymer --version
如果安装成功,则会显示版本为 -
0.18.0-pre.13.
步骤 4 - 要从 bower 安装最新的 Polymer 2.0 RC 版本,请使用以下命令。
bower install Polymer/polymer#^2.0.0-rc.3
步骤 5 - 创建一个 **index.html** 文件,并在 `
` 标签中添加以下代码。<script src = "/bower_components/webcomponentsjs/webcomponentsloader.js"></script> // it loads the polyfills <link rel = "import" href = "/bower_components/polymer/polymer.html"> // it import Polymer
步骤 6 - 使用以下命令启动你的项目。
polymer serve
构建以进行部署
要构建你的项目以进行部署,**polymer build** 命令是一种更简单的方法,它将根据命令行标志缩小、编译或捆绑你的代码。
要创建可在所有浏览器上运行的通用构建,请使用以下命令。
polymer build --js-compile
上述命令将构建项目到 build/default,你可以使用以下命令启动此目录。
polymer serve build/default
Polymer 2.0 使用 ES6 和 HTML 自定义元素。最佳实践是始终使用 ES6 来支持 ES6 的浏览器,并将 ES5 编译为不支持 ES6 的旧浏览器。下表显示了项目的最佳策略。
| 策略 | 跨浏览器支持最简单 | WC v1 性能最优 |
|---|---|---|
| 服务器 | 任何服务器都可以,包括静态服务器 | 需要差异化服务 |
| 已部署的代码 | ES5 转译 | ES6 |
| Polyfill 加载器 | webcomponents-es5-loader.js | webcomponents-loader.js |
Polymer - 元素
Polymer 元素是一组视觉和非视觉元素,旨在与布局、用户交互、选择和脚手架应用程序一起工作。这些包括从简单的按钮到具有简洁视觉效果的对话框的所有内容。下表显示了不同类型的 Polymer 元素。
| 序号 | 类型和描述 |
|---|---|
| 1 | app 元素
构建整个应用程序时,app 元素非常有用。 |
| 2 | iron 元素
这些是创建应用程序的基本构建块。 |
| 3 | paper 元素
paper 元素是一组 UI 组件,旨在实现 Google 的 Material Design 指南。 |
| 4 | Google Web 组件
Google Web 组件是 Google API 和服务的 Web 组件库。 |
| 5 | gold 元素
gold 元素是为电子商务特定用例而构建的。 |
| 6 | neon 元素
它用于使用 Web 动画为 Polymer 元素实现动画过渡。 |
| 7 | platinum 元素
platinum 元素提供将你的网页转换为真正的 Web 应用程序的功能。 |
| 8 | molecules 元素
molecule 元素有助于轻松开发应用程序,并用于将一组插件连接到 Polymer 应用程序。 |
Polymer - 自定义元素
Polymer 是一个框架,允许使用标准 HTML 元素创建自定义元素。自定义 Web 元素提供以下功能:
它提供与类关联的自定义元素名称。
当你更改自定义元素实例的状态时,它将请求生命周期回调。
如果更改实例上的属性,则会请求回调。
你可以使用 ES6 类定义自定义元素,并且类可以像以下代码中显示的那样与自定义元素关联。
//ElementDemo class is extending the HTMLElement
class ElementDemo extends HTMLElement {
// code here
};
//link the new class with an element name
window.customElements.define('element-demo', ElementDemo);
自定义元素可以用作标准元素,如下所示:
<element-demo></element-demo>
注意 - 自定义元素名称应以小写字母开头,并在名称之间包含破折号。
自定义元素生命周期
自定义元素生命周期提供一组自定义元素反应,它们负责元素生命周期的变化,并在下表中定义。
| 序号 | 反应和描述 |
|---|---|
| 1 | constructor 当你创建元素或定义先前创建的元素时,将调用此元素反应。 |
| 2 | connectedCallback 当你将元素添加到文档时,将调用此元素反应。 |
| 3 | disconnectedCallback 当你从文档中删除元素时,将调用此元素反应。 |
| 4 | attributeChangedCallback 每当你更改、追加、删除或替换文档中的元素时,都会调用此元素反应。 |
元素升级
我们可以根据规范在定义之前使用自定义元素,并且通过向该元素添加定义,任何现有的元素实例都将升级到自定义类。
自定义元素状态包含以下值:
uncustomized - 有效的自定义元素名称是内置元素或未知元素,无法成为自定义元素。
undefined - 元素可以具有有效的自定义元素名称,但无法定义。
custom - 元素可以具有有效的自定义元素名称,可以定义和升级。
failed - 尝试升级无效类的失败元素。
定义元素
可以通过创建一个扩展 Polymer.Element 的类来定义自定义元素,并将该类传递给 customElements.define 方法。该类包含 is getter 方法,该方法返回自定义元素的 HTML 标签名称。例如:
//ElementDemo class is extending the Polymer.Element
class ElementDemo extends Polymer.Element {
static get is() { return 'element-demo'; }
static get properties() {
. . .
. . .
}
constructor(){
super();
. . .
. . .
}
. . .
. . .
}
//Associate the new class with an element name
window.customElements.define(ElementDemo.is, ElementDemo);
// create an instance with createElement
var el1 = document.createElement('element-demo');
导入和 API
可以通过指定以下三个 HTML 导入来定义 Polymer 元素:
polymer-element.html - 它指定 Polymer.Element 基类。
legacy-element.html - 它使用 Polymer.LegacyElement 基类扩展 Polymer.Element 并添加 1.x 兼容的旧版 API。它还通过定义旧版 Polymer() 工厂方法来创建混合元素。
polymer.html - 它包含 Polymer 基类以及 1.x polymer.html 中包含的辅助元素。
在主 HTML 文档中定义元素
你可以使用 HTMLImports.whenReady() 函数在主 HTML 文档中定义元素。
示例
以下示例显示如何在主 HTML 文档中定义元素。创建一个 index.html 文件并添加以下代码。
<!doctype html>
<html lang = "en">
<head>
<title>Polymer Example</title>
<script src = "bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel = "import" href = "bower_components/polymer/polymer.html">
<link rel = "import" href = "define-element.html">
</head>
<body>
<define-element></define-element>
</body>
</html>
现在创建一个名为 define-element.html 的自定义元素,并包含以下代码。
<dom-module id = "define-element">
<template>
<h2>Welcome to Tutorialspoint!!!</h2>
</template>
<script>
HTMLImports.whenReady(function(){
Polymer ({
is: "define-element"
})
})
</script>
</dom-module>
输出
要运行应用程序,请导航到已创建的项目目录并运行以下命令。
polymer serve
现在打开浏览器并导航到 **http://127.0.0.1:8081/**。输出如下。
定义旧版元素
旧版元素可用于使用 Polymer 函数注册元素,该函数采用新元素的原型。原型应包含 **is**,它定义自定义元素的 HTML 标签名称。
示例
//registering an element
ElementDemo = Polymer ({
is: 'element-demo',
//it is a legecy callback, called when the element has been created
created: function() {
this.textContent = 'Hello World!!!';
}
});
//'createElement' is used to create an instance
var myelement1 = document.createElement('element-demo');
//use the constructor create an instance
var myelement2 = new ElementDemo();
生命周期回调
生命周期回调用于完成 **Polymer.Element** 类的内置功能的任务。Polymer 使用 ready 回调,当 Polymer 完成创建和初始化 DOM 元素时将调用此回调。
以下是 Polymer.js 中旧版回调的列表。
created - 当你创建元素并在设置属性值和初始化本地 DOM 之前调用它。
ready - 当你创建元素并在设置属性值和初始化本地 DOM 后调用它。
attached - 将元素附加到文档后调用它,并且可以在元素的整个生命周期中调用多次。
detached - 从文档分离元素后调用它,并且可以在元素的整个生命周期中调用多次。
attributeChanged - 当元素的属性发生更改时调用它,它包含与声明的属性不兼容的属性更改。
声明属性
可以在元素上声明属性以在数据系统中添加默认值和其他特定功能,并且可以使用它们来指定以下功能:
它指定属性类型和默认值。
当属性值发生更改时,它调用观察者方法。
它指定只读状态以阻止对属性值的意外更改。
它支持双向数据绑定,当你更改属性值时会触发事件。
它是一个计算属性,它根据其他属性动态计算值。
当你更改属性值时,它会更新并反映相应的属性值。
下表显示了属性对象支持的每个属性的键。
| 序号 | 键和描述 | 类型 |
|---|---|---|
| 1 | type 它从属性反序列化,该属性的类型使用类型的构造函数确定。 |
构造函数 (Boolean、Date、Number、String、Array 或 Object) |
| 2 | value 它指定属性的默认值,如果它是一个函数,则它使用返回值作为属性的默认值。 |
布尔值、数字、字符串或函数。 |
| 3 | reflectToAttribute 如果此键设置为 true,则它会在宿主节点上设置相应的属性。如果你将属性值设置为 Boolean,则可以创建一个标准的 HTML 布尔属性。 |
布尔值 |
| 4 | 只读 如果此键设置为 true,则无法通过赋值或数据绑定直接设置属性。 |
布尔值 |
| 5 | 通知 如果此键设置为 true,则可以使用该属性进行双向数据绑定;当您更改属性时,将触发 property-name-changed 事件。 |
布尔值 |
| 6 | 计算属性 您可以通过调用方法来计算参数的值(只要它发生变化),值将简化为方法名称和参数列表。 |
字符串 |
| 7 | 观察者 当属性值发生变化时,调用简化为值的方法名。 |
字符串 |
属性反序列化
如果属性在 properties 对象中配置,则根据指定的类型以及元素实例上相同属性名称,反序列化与实例上某个属性匹配的属性名称。
如果没有在 properties 对象中定义其他属性选项,则可以直接将指定的类型设置为属性的值;否则,它会将值提供给 properties 配置对象中的 type 键。
配置布尔属性
布尔属性可以通过标记进行配置,将其设置为 false;如果将其设置为 true,则无法从标记进行配置,因为带有或不带有值的属性都等于 true。因此,这被认为是 Web 平台中属性的标准行为。
对象和数组属性可以通过以 JSON 格式传递它们来配置,例如:
<element-demo player = '{ "name": "Sachin", "country": "India" }'></element-demo>
配置默认属性值
可以使用 properties 对象中的 value 字段配置默认属性,它可以是原始值,也可以是返回值的函数。
示例
以下示例描述了如何在 properties 对象中配置默认属性值。
<link rel = "import" href = "../../bower_components/polymer/polymer-element.html">
//it specifies the start of an element's local DOM
<dom-module id="polymer-app">
<template>
<style>
:host {
color:#33ACC9;
}
</style>
<h2>Hello...[[myval]]!</h2>
</template>
<script>
//cusom element extending the Polymer.Element class
class PolymerApp extends Polymer.Element {
static get is() { return 'polymer-app'; }
static get properties() {
return {
myval: {
type: String,
//displaying this value on screen
value: 'Welcome to Tutorialspoint;!!!'
},
data: {
type: Object,
notify: true,
value: function() { return {}; }
}
}
}
}
window.customElements.define(PolymerApp.is, PolymerApp);
</script>
</dom-module>
输出
按前面示例中所示运行应用程序,然后导航到 **http://127.0.0.1:8000/**。输出如下所示。
只读属性
您可以通过在 properties 对象中将 readOnly 标志设置为 true 来避免对生成的数据进行意外更改。元素使用约定 _setProperty(value) 的设置器来更改属性值。
示例
以下示例描述了在 properties 对象中使用只读属性。创建一个 index.html 文件,并在其中添加以下代码
<!doctype html>
<html>
<head>
<title>Polymer Example</title>
<script src = "bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel = "import" href = "bower_components/polymer/polymer.html">
<link rel = "import" href = "my-element.html">
</head>
<body>
<my-element></my-element>
</body>
</html>
现在,创建一个名为 my-element.html 的文件,并包含以下代码。
<link rel = "import" href = "bower_components/polymer/polymer-element.html">
<link rel = "import" href = "prop-element.html">
//it specifies the start of an element's local DOM
<dom-module id = "my-element">
<template>
<prop-element my-prop = "{{demoProp}}"></prop-element>
<p>Present value: <span>{{demoProp}}</span></p>
</template>
<script>
Polymer ({
is: "my-element", properties: {
demoProp: String
}
});
</script>
</dom-module>
接下来,创建一个名为 prop-element.html 的文件,并添加以下代码。
//it specifies the start of an element's local DOM
<dom-module id="prop-element">
<template>
<button on-click="onClickFunc">Change value</button>
</template>
<script>
Polymer ({
is: "prop-element", properties: {
myProp: {
type: String,
notify: true,
readOnly: true,
value: 'This is initial value...'
}
},
onClickFunc: function(){
this._setMyProp('This is new value after clicking the button...');
}
});
</script>
</dom-module>
输出
按前面示例中所示运行应用程序,然后导航到 **http://127.0.0.1:8081/**。输出如下所示。
单击按钮后,它将更改值,如下面的屏幕截图所示。
将属性反映到属性
通过在 properties 配置对象中的属性上将 **reflectToAttribute** 设置为 true,可以将 HTML 属性与属性值同步。
属性序列化
在将属性反射或绑定到属性时,属性值可以序列化到属性,并且默认情况下,可以根据值的当前类型序列化值。
**字符串** - 无需序列化。
**日期或数字** - 使用 toString 序列化值。
**布尔值** - 将显示的无值属性设置为 true 或 false。
**数组或对象** - 使用 JSON.stringify 序列化值。
Polymer - Shadow DOM 和样式
Shadow DOM 是 DOM 的一个新属性,用于构建组件。
示例
在下面的代码中,header 组件包含页面标题和菜单按钮。
<header-demo>
<header>
<h1>
<button>
Shadow DOM 允许在称为 **shadow tree** 的作用域子树中定位子元素。
<header-demo>
#shadow-root
<header>
<h1>
<button>
shadow-root 根被称为 shadow tree 的顶部,附加到树的元素被称为 shadow host (header-demo)。此 shadow host 包含一个名为 shadowRoot 的属性,该属性指定 shadow root。shadow root 使用 host 属性标识宿主元素。
Shadow DOM 和组合
如果 Shadow DOM 中有元素,则可以渲染 shadow tree 来代替元素的子元素。可以通过将
例如,对
<header> <h1><slot></slot></h1> <button>Menu</button> </header>
将子元素添加到
<header-demo>Shadow DOM</header-demo>
header 将
<header-demo>
<header>
<h1>Shadow DOM</h1>
<button>Menu</button>
</header>
</header-demo>
回退内容
当没有节点分配给 slot 时,可以显示回退内容。例如:
<my-element>
#shadow-root
<slot id = "myimgicon">
<img src = "img-demo.png">
</slot>
<slot></slot>
<my-element>
您可以为元素提供您自己的图标,例如:
<my-element> <img slot = "myimgicon" src = "warning.png"> <my-element>
多级分发
您可以将 slot 元素分配给一个 slot,这称为多级分发。
例如,考虑如下所示的 shadow tree 的两个级别:
<parent-element>
#shadow-root
<child-element>
<!-- display the light DOM children of parent-element inside child-element -->
<slot id = "parent-slot">
<child-element>
#shadow-root
<div>
<!-- Render the light DOM children inside div by using child-element -->
<slot id = "child-slot">
考虑以下代码:
<parent-element> <p>This is light DOM</p> <parent-element>
扁平化树的结构如下所示。
<parent-element>
<child-element>
<div>
<slot id = "child-slot">
<slot id = "parent-slot">
<p>This is light DOM</p>
Shadow DOM 使用以下 Slot API 来检查分发:
**HTMLElement.assignedSlot** - 它为元素分配 slot,如果没有将元素分配给 slot,则返回 null。
**HTMLSlotElement.assignedNodes** - 它提供节点列表以及 slot,当您将 flatten 选项设置为 true 时,它返回分发的节点。
**HTMLSlotElement.slotchange** - 当 slot 的分发节点发生变化时,此事件将触发。
事件重新定位
它指定事件的目标,其中元素可以在与侦听元素相同的范围内表示。它提供来自自定义元素的事件,看起来像是来自自定义元素标签的事件,而不是其中的元素。
示例
以下示例演示了在 Polymer.js 中使用事件重新定位。创建一个名为 index.html 的文件,并将以下代码放入其中。
<!doctype html>
<html>
<head>
<title>Polymer Example</title>
<script src = "bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel = "import" href = "bower_components/polymer/polymer.html">
<link rel = "import" href = "retarget-event.html">
</head>
<body>
<template id = "myapp" is = "dom-bind">
<retarget-event on-tap = "clicky"></retarget-event>
</template>
<script>
var myval = document.querySelector('#myapp');
myval.clicky = function(e) {
console.log("The retargeted result:", Polymer.dom(myval));
console.log("Normal result:", e);
};
</script>
</body>
</html>
现在,创建一个名为 retarget-event.html 的文件,并包含以下代码。
<link rel = "import" href = "bower_components/polymer/polymer-element.html">
//it specifies the start of an element's local DOM
<dom-module id = "retarget-event">
<template>
<span>Click on this text to see result in console...</span>
</template>
<script>
Polymer ({
is: 'retarget-event',
});
</script>
</dom-module>
输出
要运行应用程序,请导航到已创建的项目目录并运行以下命令。
polymer serve
现在打开浏览器并导航到 **http://127.0.0.1:8081/**。输出如下。
单击上面的文本并打开控制台,查看如下面的屏幕截图所示的重新定位事件。
Shadow DOM 样式
您可以使用样式属性来设置 Shadow DOM 的样式,这些样式属性从宿主继承到 shadow tree。
示例
<style>
.mydemo { background-color: grey; }
</style>
<my-element>
#shadow-root
<style>
//this div will have blue background color
div { background-color: orange; }
</style>
<div class = "mydemo">Demo</div>
DOM 模板
可以使用 DOM 模板为元素创建 DOM 子树。您可以为元素创建 shadow root,并通过将 DOM 模板添加到元素来将模板复制到 shadow tree。
DOM 模板可以通过两种方式指定:
创建一个
元素,它应该与元素的名称以及 id 属性匹配。 在
内定义一个 元素。
示例
<dom-module id = "my-template">
<template>I am in my template!!!</template>
<script>
class MyTemplate extends Polymer.Element {
static get is() { return 'my-template' }
}
customElements.define(MyTemplate.is, MyTemplate);
</script>
</dom-module>
设置元素的 Shadow DOM 样式
Shadow DOM 允许使用样式属性(例如字体、文本颜色和类)来设置自定义元素的样式,而无需将其应用到元素范围之外。
让我们使用 **:host** 选择器来设置宿主元素的样式(附加到 Shadow DOM 的元素称为宿主)。创建一个名为 polymer-app.html 的文件,并在其中添加以下代码。
<link rel = "import" href = "../../bower_components/polymer/polymer-element.html">
<dom-module id = "polymer-app">
<template>
<style>
:host {
color:#33ACC9;
}
</style>
<h2>Hello...[[myval]]!</h2>
</template>
<script>
class PolymerApp extends Polymer.Element {
static get is() { return 'polymer-app'; }
static get properties() {
return {
myval: {
type: String, value: 'Welcome to Tutorialspoint!!!'
}
};
}
}
window.customElements.define(PolymerApp.is, PolymerApp);
</script>
</dom-module>
按前面 章节 中所示运行应用程序,然后导航到 **http://127.0.0.1:8000/**。输出如下所示。
设置已插入内容的样式
可以在元素的模板中创建 **插槽**,这些插槽在运行时被占用。
示例
以下示例描述了在元素模板中使用已插入内容。创建一个 index.html 文件,并在其中添加以下代码。
<!doctype html>
<html>
<head>
<title>Polymer Example</title>
<link rel = "import" href = "bower_components/polymer/polymer.html">
<link rel = "import" href = "slotted-content.html">
</head>
<body>
<slotted-content>
<div slot = "text">This is Polymer.JS Slotted Content Example</div>
</slotted-content>
</body>
</html>
现在创建一个名为 slotted-content.html 的文件,并包含以下代码。
<link rel = "import" href = "bower_components/polymer/polymer-element.html">
<dom-module id = "slotted-content">
<template>
<style>
::slotted(*) {
font-family: sans-serif;
color:#E94A9D;
}
</style>
<h2>Hello...[[prop1]]</h2>
<h3>
<div><slot name='text'></slot></div>
</h3>
</template>
<script>
Polymer ({
is: 'slotted-content', properties: {
prop1: {
type: String,
value: 'Welcome to Tutorialspoint!!',
},
},
});
</script>
</dom-module>
按前面示例中所示运行应用程序,然后导航到 **http://127.0.0.1:8081/**。输出如下所示。
使用样式模块
您可以使用样式模块在元素之间共享样式。在样式模块中指定样式,并在元素之间共享它们。
示例
以下示例演示了如何在元素之间使用样式模块。创建一个 index.html 文件,并在其中添加以下代码。
<!doctype html>
<html>
<head>
<title>Polymer Example</title>
<link rel = "import" href = "bower_components/polymer/polymer.html">
<link rel = "import" href = "style-module.html">
</head>
<body>
<style-module></style-module>
</body>
</html>
创建一个名为 style-module.html 的文件,其中包含以下代码。
<link rel = "import" href = "bower_components/polymer/polymer-element.html">
<dom-module id = "style-module">
<template>
<!-- here, including the imported styles from colors-module page -->
<style include="colors-module"></style>
<style>
:host {
font-family: sans-serif;
color: green;
}
</style>
<h2>Hello...[[prop1]]</h2>
<p class = "color1">Sharing styles with style modules 1...</p>
<p class = "color2">Sharing styles with style modules 2...</p>
<p class = "color3">Sharing styles with style modules 3...</p>
</template>
<script>
Polymer ({
is: 'style-module', properties: {
prop1: {
type: String, value: 'Welcome to Tutorialspoint!!',
},
},
});
</script>
</dom-module>
现在,创建一个名为 _colors-module.html_ 的文件,它为元素提供样式模块,如下面的代码所示。
<link rel = "import" href = "bower_components/polymer/polymer-element.html">
<dom-module id = 'colors-module'>
<template>
<style>
p.color1 {
color: #EA5AA5;
}
p.color2 {
color: #4B61EA;
}
p.color3 {
color: #D3AA0A;
}
</style>
</template>
</dom-module>
运行应用程序并导航到 **http://127.0.0.1:8081/**。输出如下所示。
使用自定义属性
可以使用自定义 CSS 属性来设置应用程序中元素外观的样式,方法是使用 Polymer 元素。自定义属性提供级联 CSS 变量,可以在自定义元素的环境之外使用,从而避免通过样式表散布样式数据。
自定义属性的定义方式类似于标准 CSS 属性,它们从组合的 DOM 树继承。在前面的示例中,您可以看到为元素定义的自定义 CSS 属性。
在 CSS 继承下,如果未为元素定义样式,则它将继承其父元素的样式,如下面的代码所示。
<link rel = "import" href = "components/polymer/myelement-style.html">
<myelement-style>
<style is = "myelement-style">
p {
color: var(--paper-red-900);
}
paper-checkbox {
--paper-checkbox-checked-color: var(--paper-red-900);
}
</style>
</myelement-style>
<body>
<p><paper-checkbox>Check Here</paper-checkbox></p>
</body>
Polymer - 事件
元素使用事件来与 DOM 树的状态变化进行通信,这些事件可以与父元素通信,并使用标准 DOM API 来创建、调度和侦听事件。Polymer 使用 **带注释的事件侦听器**,它将事件侦听器定义为 DOM 模板的小片段,并可以使用模板中的 onevent 注释添加到 DOM 子元素。
示例
以下示例在模板中添加带注释的事件侦听器。创建一个名为 index.html 的文件,并将以下代码放入其中。
<!doctype html>
<html>
<head>
<title>Polymer Example</title>
<script src = "bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel = "import" href="bower_components/polymer/polymer.html">
<link rel = "import" href = "annotated-eventlistners.html">
</head>
<body>
<template id = "myapp" is = "dom-bind">
//tap event is part of gesture events that fires consistently across both mobile
//and desktop devices
<annotated-eventlistners on-tap = "myClick"></annotated-eventlistners>
</template>
<script>
var myval = document.querySelector('#myapp');
myval.myClick = function(e) {
console.log('Hello World!!!');
};
</script>
</body>
</html>
输出
要运行应用程序,请导航到已创建的项目目录并运行以下命令。
polymer serve
现在打开浏览器并导航到 **http://127.0.0.1:8000/**。输出如下所示。
单击文本以查看控制台中的结果,如下面的屏幕截图所示。
自定义事件
可以使用标准 CustomEvent 构造函数和宿主元素的 dispatchEvent 方法触发自定义事件。
考虑以下示例,该示例从宿主元素触发自定义事件。打开 index.html 文件,并在其中添加以下代码。
<!doctype html>
<html>
<head>
<title>Polymer Example</title>
<script src = "bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel = "import" href = "bower_components/polymer/polymer.html">
<link rel = "import" href = "custom-event.html">
</head>
<body>
<custom-event></custom-event>
<script>
document.querySelector('custom-event').addEventListener('customValue', function (e) {
console.log(e.detail.customval); // true
})
</script>
</body>
</html>
现在,创建一个名为 custom-event.html 的文件,并包含以下代码。
<link rel = "import" href = "bower_components/polymer/polymer-element.html">
//it specifies the start of an element's local DOM
<dom-module id = "custom-event">
<template>
<h2>Custom Event Example</h2>
<button on-click = "myClick">Click Here</button>
</template>
<script>
Polymer ({
is: "custom-event", myClick(e) {
this.dispatchEvent(new CustomEvent('customValue', {detail: {customval: true}}));
}
});
</script>
</dom-module>
输出
按前面示例中所示运行应用程序,然后导航到 **http://127.0.0.1:8000/**。输出如下所示。
现在单击按钮,打开控制台,查看自定义事件的 true 值,如下面的屏幕截图所示。
现在转向“事件重新定位”,它指定事件的目标,其中元素可以在与侦听元素相同的范围内表示。例如,在使用主文档中的侦听器时,而不是在 shadow tree 中,目标可以被视为主文档中的元素。您可以参考 Polymer shadow dom 样式 章节以获取更多说明和示例。
手势事件
手势事件可用于用户交互,它们在触摸设备和移动设备上都定义了更好的交互。例如,tap 事件是手势事件的一部分,它在移动设备和桌面设备上都能一致地触发。
您可以参考本章开头解释的手势事件示例,该示例使用 **on-tap** 事件在模板中添加带注释的事件侦听器。
下表列出了不同类型的手势事件类型。
| 序号 | 事件类型和描述 | 属性 |
|---|---|---|
| 1 | down 它指定手指/按钮已按下。 |
|
| 2 | up 它指定手指/按钮已抬起。 |
|
| 3 | tap 它指定 up 和 down 操作的发生。 |
|
| 4 | track 它指定 up 和 down 操作的发生。 |
|
示例
以下示例指定了在模板中使用手势事件类型的用法。创建一个名为 index.html 的文件,并将以下代码放入其中。
<!doctype html>
<html>
<head>
<title>Polymer Example</title>
<script src = "bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel = "import" href = "bower_components/polymer/polymer.html">
<link rel = "import" href = "gesture-event.html">
</head>
<body>
<gesture-event></gesture-event>
</body>
</html>
现在,创建另一个名为 gesture-event.html 的文件,并包含以下代码。
<link rel = "import" href = "bower_components/polymer/polymer-element.html">
//it specifies the start of an element's local DOM
<dom-module id = "gesture-event">
<template>
<style>
#box {
width: 200px;
height: 200px;
background: #D7D0B7;
}
</style>
<h2>Gesture Event Types Example</h2>
<div id = "box" on-track = "myClick">{{track_message}}</div>
</template>
<script>
Polymer ({
is: 'gesture-event', myClick: function(e) {
switch(e.detail.state) {
case 'start':
this.track_message = 'Tracking event started...';
break;
case 'track':
this.track_message = 'Tracking event is in progress... ' +
e.detail.x + ', ' + e.detail.y;
break;
case 'end':
this.track_message = 'Tracking event ended...';
break;
}
}
});
</script>
</dom-module>
输出
按照前面的示例运行应用程序,并导航到http://127.0.0.1:8081/。现在开始拖动元素中的鼠标,它将显示如下屏幕截图所示的状态。
拖动元素中的鼠标后,它将显示事件跟踪的进度,如下面的屏幕截图所示。
松开鼠标时,它将结束对元素的跟踪事件,如下面的屏幕截图所示。
Polymer - 数据系统
Polymer 允许通过采取不同的操作(例如 -)来观察元素属性的变化:
观察者 (Observers) − 每当数据更改时,它都会调用回调函数。
计算属性 (Computed Properties) − 它根据其他属性计算虚拟属性,并在输入数据更改时重新计算它们。
数据绑定 (Data Bindings) − 每当数据更改时,它都会使用注释更新 DOM 节点的属性、特性或文本内容。
数据路径 (Data Paths)
路径 (Path) 是数据系统中的一个字符串,它提供相对于作用域的属性或子属性。作用域可以是宿主元素。路径可以通过数据绑定链接到不同的元素。如果元素通过数据绑定连接,则可以将数据更改从一个元素移动到另一个元素。
示例
<dom-module id = "my-profile">
<template>
. . .
<address-card address="{{myAddress}}"></address-card>
</template>
. . .
</dom-module>
如果`
以下是 Polymer.js 中特殊类型的路径段:
通配符 (*) 字符可以用作路径中的最后一个段。
可以通过将字符串拼接作为路径中的最后一个段,将数组变动显示到给定的数组中。
数组项路径指示数组中的一个项,数值路径段指定数组索引。
在数据路径中,每个路径段都是一个属性名称,它们包括以下两种路径:
用点分隔的路径段。例如:“apple.grapes.orange”。
在一个字符串数组中,每个数组元素要么是一个路径段,要么是一个点分隔路径。例如:["apple","grapes","orange"], ["apple.grapes","orange"]。
数据流 (Data Flow)
示例
以下示例指定了数据流的双向绑定。创建一个 index.html 文件,并在其中添加以下代码。
<!doctype html>
<html>
<head>
<title>Polymer Example</title>
<script src = "bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel = "import" href = "bower_components/polymer/polymer.html">
<link rel = "import" href = "my-element.html">
</head>
<body>
<my-element></my-element>
</body>
</html>
现在创建一个名为 my-element.html 的文件,并包含以下代码。
<link rel = "import" href = "bower_components/polymer/polymer-element.html">
<link rel = "import" href = "prop-element.html">
//it specifies the start of an element's local DOM
<dom-module id = "my-element">
<template>
<prop-element my-prop="{{demoProp}}"></prop-element>
<p>
Present value: <span>{{demoProp}}</span>
</p>
</template>
<script>
Polymer ({
is: "my-element", properties: {
demoProp: String
}
});
</script>
</dom-module>
接下来,创建一个名为 prop-element.html 的文件,并添加以下代码。
//it specifies the start of an element's local DOM
<dom-module id = "prop-element">
<template>
<button on-click = "onClickFunc">Change value</button>
</template>
<script>
Polymer ({
is: "prop-element", properties: {
myProp: {
type: String,
notify: true,
readOnly: true,
value: 'This is initial value...'
}
},
onClickFunc: function(){
this._setMyProp('This is new value after clicking the button...');
}
});
</script>
</dom-module>
输出
按照前面章节中的说明运行应用程序,并导航到http://127.0.0.1:8081/。输出结果如下所示。
单击按钮后,它将更改值,如下面的屏幕截图所示。
链接两个路径 (Linking Two Paths)
您可以使用 linkPaths 方法将两条路径链接到同一个对象,并且需要使用数据绑定来生成元素之间的更改。
示例
linkPaths('myTeam', 'players.5');
可以使用 unlinkPaths 方法删除路径链接,如下所示:
unlinkPaths('myTeam');
观察者 (Observers)
发生在元素数据上的可观察更改会调用称为观察者的方法。以下是观察者的类型。
简单观察者用于观察单个属性。
复杂观察者用于观察多个属性或路径。
数据绑定 (Data Binding)
数据绑定可用于连接其本地 DOM 中宿主元素的元素属性或特性。数据绑定可以通过向 DOM 模板添加注释来创建,如下面的代码所示。
<dom-module id = "myhost-element">
<template>
<target-element target-property = "{{myhostProperty}}"></target-element>
</template>
</dom-module>
本地 DOM 模板中数据绑定的结构如下所示:
property-name=annotation-or-compound-binding
或
attribute-name$=annotation-or-compound-binding
绑定的左侧指定目标属性或特性,而绑定的右侧指定绑定注释或复合绑定。绑定注释中的文本用双大括号({{ }})或双方括号([[ ]])分隔符括起来,复合绑定包括一个或多个字符串文字绑定注释。
以下是与数据绑定用例一起使用的辅助元素:
模板重复器 (Template Repeater) − 可以为数组中的每个项目创建一个模板内容的实例。
数组选择器 (Array Selector) − 它为结构化数据的数组提供选择状态。
条件模板 (Conditional Template) − 如果条件为真,则可以识别内容。
自动绑定模板 (Auto-binding Template) − 它指定 Polymer 元素外部的数据绑定。
如果辅助元素更新 DOM 树,则 DOM 树会触发 dom-change 事件。有时,您可以通过更改模型数据来与 DOM 交互,而不是通过与创建的节点交互。因此,您可以使用 dom-change 事件直接访问节点。