- 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 事件直接訪問節點。