Angular開發實務(七): 跨平台操作DOM及渲染器Renderer2
在《Angular開發實踐(六):服務端渲染》這篇文章的最後,我們也提到了在服務端渲染
中需要牢記的幾件事件,其中就包括不要使用window
、 document
、 navigator
等瀏覽器特有的類型以及直接操作DOM元素。
這樣就引出了 Angular 主要特性之一:橫跨所有平台。透過適當的方法,使用 Angular 建構的應用,可重複使用在多種不同平台的應用上 —— Web、行動 Web、行動應用、原生應用程式和桌面原生應用程式。
為了能夠支援跨平台,Angular 透過抽象層封裝了不同平台的差異。例如定義了抽象類別 Renderer2 、抽象類別 RootRenderer 等。另外也定義了以下參考類型:ElementRef、TemplateRef、ViewRef 、ComponentRef 和 ViewContainerRef 等。透過 模板變數
、@ViewChild
等方法取得DOM元素。
為了示範,先定義一個元件DemoComponent:
import { AfterViewInit, Component, ElementRef, Renderer2, ViewChild } from '@angular/core'; @Component({ template: ` <p id="demop" #demop>this is p!</p> p的id:{{demop.id}} <!-- p的id:demop --> ` }) export class DemoComponent implements AfterViewInit { @ViewChild('demop') demop: ElementRef; // @ViewChild通过模板变量名获取 constructor(private renderer: Renderer2) { } ngAfterViewInit() { console.log('p的id:' + this.demop.nativeElement.id); // p的id:demop this.renderer.setStyle(this.demop.nativeElement, 'background-color', 'red'); // 通过Renderer2设置p的css样式background-color } }
取得元件中的p
在Angular應用程式中不應該透過原生API 或jQuery 直接取得DOM元素:
let element1 = document.getElementById("demop"); // jQuery获取: $('#demop')
而是應該透過Angular提供的方法來取得DOM元素:
模板變數
<p id="demop" #demop>this is p!</p> p的id:{{demop.id}} <!-- p的id:demop -->
在元件模板中,我們在p 上定義了#demop 的模板變量,那麼demop 就等於該p 的DOM 對象,因此我們可以透過demop.id
直接取得p 的id。
@ViewChild
@ViewChild('demop') demop: ElementRef; // @ViewChild通过模板变量名获取 ngAfterViewInit() { console.log('p的id:' + this.demop.nativeElement.id); // p的id:demop }
在元件類別中,我們透過@ViewChild 取得到包裝有p 的DOM 物件的ElementRef 對象,ElementRef 定義如下:
class ElementRef<T> { constructor(nativeElement: T) nativeElement: T }
因此我們可以在ngAfterViewInit 中透過this.demop.nativeElement 取得到該p 的DOM 對象,然後取得元素的id。
操作元件中的p
在上面透過幾種方式取得到p 的DOM 對象,那麼我們要如果對它進行操作呢(設定樣式、屬性、插入子元素等) ?透過原始API 或 jQuery 肯定是不允許的了。
這樣我們就引出Angular抽象類別 Renderer2
來設定元素樣式、屬性、插入子元素等操作。
Renderer2 的定義如下:
class Renderer2 { get data: {...} destroyNode: ((node: any) => void) | null destroy(): void createElement(name: string, namespace?: string | null): any // 创建元素 createComment(value: string): any // 创建注释元素 createText(value: string): any // 创建文本元素 appendChild(parent: any, newChild: any): void // 添加子元素(在最后) insertBefore(parent: any, newChild: any, refChild: any): void // 添加子元素(在最前) removeChild(parent: any, oldChild: any): void // 移除子元素 selectRootElement(selectorOrNode: string | any): any // 获取根元素 parentNode(node: any): any // 获取父元素 nextSibling(node: any): any // 获取下一个兄弟元素 setAttribute(el: any, name: string, value: string, namespace?: string | null): void // 设置属性 removeAttribute(el: any, name: string, namespace?: string | null): void // 移除属性 addClass(el: any, name: string): void // 添加样式类 removeClass(el: any, name: string): void // 移除样式类 setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2): void // 设置样式 removeStyle(el: any, style: string, flags?: RendererStyleFlags2): void // 移除样式 setProperty(el: any, name: string, value: any): void // 设置DOM对象属性,不同于元素属性 setValue(node: any, value: string): void // 设置元素值 listen(target: 'window' | 'document' | 'body' | any, eventName: string, callback: (event: any) => boolean | void): () => void // 注册事件 }
因此,我們要改變 p 的背景色,就可以這樣做:
ngAfterViewInit() { this.renderer.setStyle(this.demop.nativeElement, 'background-color', 'red'); // 通过Renderer2设置p的css样式background-color }
在《Angular開發實踐(六):服務端渲染》這篇文章的最後,我們也提到了在服務端渲染
中需要牢記的幾件事件,其中就包括不要使用window
、 document
、 navigator
等瀏覽器特有的類型以及直接操作DOM元素。
這樣就引出了 Angular 主要特性之一:橫跨所有平台。透過適當的方法,使用 Angular 建構的應用,可重複使用在多種不同平台的應用上 —— Web、行動 Web、行動應用、原生應用程式和桌面原生應用程式。
為了能夠支援跨平台,Angular 透過抽象層封裝了不同平台的差異。例如定義了抽象類別 Renderer2 、抽象類別 RootRenderer 等。另外也定義了以下參考類型:ElementRef、TemplateRef、ViewRef 、ComponentRef 和 ViewContainerRef 等。透過 模板變數
、@ViewChild
等方法取得DOM元素。
為了示範,先定義一個元件DemoComponent:
import { AfterViewInit, Component, ElementRef, Renderer2, ViewChild } from '@angular/core'; @Component({ template: ` <p id="demop" #demop>this is p!</p> p的id:{{demop.id}} <!-- p的id:demop --> ` }) export class DemoComponent implements AfterViewInit { @ViewChild('demop') demop: ElementRef; // @ViewChild通过模板变量名获取 constructor(private renderer: Renderer2) { } ngAfterViewInit() { console.log('p的id:' + this.demop.nativeElement.id); // p的id:demop this.renderer.setStyle(this.demop.nativeElement, 'background-color', 'red'); // 通过Renderer2设置p的css样式background-color } }
取得元件中的p
在Angular應用程式中不應該透過原生API 或jQuery 直接取得DOM元素:
let element1 = document.getElementById("demop"); // jQuery获取: $('#demop')
而是應該透過Angular提供的方法來取得DOM元素:
模板變數
<p id="demop" #demop>this is p!</p> p的id:{{demop.id}} <!-- p的id:demop -->
在元件模板中,我們在p 上定義了#demop 的模板變量,那麼demop 就等於該p 的DOM 對象,因此我們可以透過demop.id
直接取得p 的id。
@ViewChild
@ViewChild('demop') demop: ElementRef; // @ViewChild通过模板变量名获取 ngAfterViewInit() { console.log('p的id:' + this.demop.nativeElement.id); // p的id:demop }
在元件類別中,我們透過@ViewChild 取得到包裝有p 的DOM 物件的ElementRef 對象,ElementRef 定義如下:
class ElementRef<T> { constructor(nativeElement: T) nativeElement: T }
因此我們可以在ngAfterViewInit 中透過this.demop.nativeElement 取得到該p 的DOM 對象,然後取得元素的id。
操作元件中的p
在上面透過幾種方式取得到p 的DOM 對象,那麼我們要如果對它進行操作呢(設定樣式、屬性、插入子元素等) ?透過原始API 或 jQuery 肯定是不允許的了。
這樣我們就引出Angular抽象類別 Renderer2
來設定元素樣式、屬性、插入子元素等操作。
Renderer2 的定義如下:
class Renderer2 { get data: {...} destroyNode: ((node: any) => void) | null destroy(): void createElement(name: string, namespace?: string | null): any // 创建元素 createComment(value: string): any // 创建注释元素 createText(value: string): any // 创建文本元素 appendChild(parent: any, newChild: any): void // 添加子元素(在最后) insertBefore(parent: any, newChild: any, refChild: any): void // 添加子元素(在最前) removeChild(parent: any, oldChild: any): void // 移除子元素 selectRootElement(selectorOrNode: string | any): any // 获取根元素 parentNode(node: any): any // 获取父元素 nextSibling(node: any): any // 获取下一个兄弟元素 setAttribute(el: any, name: string, value: string, namespace?: string | null): void // 设置属性 removeAttribute(el: any, name: string, namespace?: string | null): void // 移除属性 addClass(el: any, name: string): void // 添加样式类 removeClass(el: any, name: string): void // 移除样式类 setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2): void // 设置样式 removeStyle(el: any, style: string, flags?: RendererStyleFlags2): void // 移除样式 setProperty(el: any, name: string, value: any): void // 设置DOM对象属性,不同于元素属性 setValue(node: any, value: string): void // 设置元素值 listen(target: 'window' | 'document' | 'body' | any, eventName: string, callback: (event: any) => boolean | void): () => void // 注册事件 }
因此,我們想要改變p 的背景色,就可以這樣做:
ngAfterViewInit() { this.renderer.setStyle(this.demop.nativeElement, 'background-color', 'red'); // 通过Renderer2设置p的css样式background-color }
以上是Angular開發實務(七): 跨平台操作DOM及渲染器Renderer2的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Angular.js是一種可自由存取的JavaScript平台,用於建立動態應用程式。它允許您透過擴展HTML的語法作為模板語言,以快速、清晰地表示應用程式的各個方面。 Angular.js提供了一系列工具,可協助您編寫、更新和測試程式碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。 Node.js是一個基於ChromeV8引擎的JavaScript運行環境,可讓您在伺服器端執行JavaScript程式碼。要在Ub

Go語言作為一種快速、高效的程式語言,在後端開發中得到了廣泛應用。不過,隨著Go語言的不斷發展,越來越多的開發者開始嘗試在前端領域使用Go語言進行GUI介面開發。本文將為讀者介紹如何利用Go語言進行跨平台的GUI介面設計,並提供具體的程式碼範例來幫助讀者更好地入門和應用。一、Go語言GUI開發簡介GUI(GraphicalUserInterface,圖形用

LinuxDeploy的操作步驟及注意事項LinuxDeploy是一款強大的工具,可協助使用者在Android裝置上快速部署各種Linux發行版,讓使用者在行動裝置上體驗完整的Linux系統。本文將詳細介紹LinuxDeploy的操作步驟以及注意事項,同時提供具體的程式碼範例,幫助讀者更好地使用此工具。操作步驟:安裝LinuxDeploy:首先在

隨著智慧型手機的普及,螢幕截圖功能成為日常使用手機的必備技能之一。華為Mate60Pro作為華為公司的旗艦手機之一,其截圖功能自然也備受用戶關注。今天,我們就來分享華為Mate60Pro手機的截圖操作步驟,讓大家能夠更方便地進行截圖操作。首先,華為Mate60Pro手機提供了多種截圖方式,可以依照個人習慣選擇適合自己的方式來操作。以下詳細介紹幾種常用的截

Angular框架中元件的預設顯示行為不是區塊級元素。這種設計選擇促進了元件樣式的封裝,並鼓勵開發人員有意識地定義每個元件的顯示方式。透過明確設定CSS屬性 display,Angular組件的顯示可以完全控制,從而實現所需的佈局和響應能力。

PHP跨平台開發趨勢:漸進式Web應用、響應式設計、雲端運算整合。技術展望:PHP框架持續發展、人工智慧整合、物聯網支援。實戰案例:Laravel建構跨平台漸進式Web應用。

目錄Astar Dapp 質押原理質押收益 拆解潛在空投項目:AlgemNeurolancheHealthreeAstar Degens DAOVeryLongSwap 質押策略 & 操作“AstarDapp質押”今年初已升級至V3版本,對質押收益規則做了不少調整。目前首個質押週期已結束,第二質押週期的「投票」子週期剛開始。若要獲得「額外獎勵」收益,需掌握此關鍵階段(預計持續至6月26日,現餘不到5天)。我將細緻拆解Astar質押收益,

C++函數在跨平台GUI開發中發揮著至關重要的作用,提供跨平台API來建立和管理GUI。這些API包括SFML、Qt和GLFW,提供通用函數來操作視窗、控制項和事件。這些函數允許開發者在不同作業系統上建立一致的GUI體驗,簡化了多平台開發,並實現了在各種平台上無縫運行的應用程式。
