目錄
取得元件中的p
模板變數
@ViewChild
操作元件中的p
首頁 web前端 js教程 Angular開發實務(七): 跨平台操作DOM及渲染器Renderer2

Angular開發實務(七): 跨平台操作DOM及渲染器Renderer2

Apr 02, 2018 pm 03:11 PM
angular 操作 跨平台

《Angular開發實踐(六):服務端渲染》這篇文章的最後,我們也提到了在服務端渲染中需要牢記的幾件事件,其中就包括不要使用windowdocumentnavigator等瀏覽器特有的類型以及直接操作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(&#39;demop&#39;) demop: ElementRef; // @ViewChild通过模板变量名获取

    constructor(private renderer: Renderer2) {
    }

    ngAfterViewInit() {
        console.log(&#39;p的id:&#39; + this.demop.nativeElement.id); // p的id:demop
        this.renderer.setStyle(this.demop.nativeElement, &#39;background-color&#39;, &#39;red&#39;); // 通过Renderer2设置p的css样式background-color
    }
}
登入後複製
登入後複製

取得元件中的p

在Angular應用程式中不應該透過原生API 或jQuery 直接取得DOM元素:

let element1 = document.getElementById("demop"); // jQuery获取: $(&#39;#demop&#39;)
登入後複製

而是應該透過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(&#39;demop&#39;) demop: ElementRef; // @ViewChild通过模板变量名获取

ngAfterViewInit() {
    console.log(&#39;p的id:&#39; + 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: &#39;window&#39; | &#39;document&#39; | &#39;body&#39; | any, eventName: string, callback: (event: any) => boolean | void): () => void // 注册事件
}
登入後複製
登入後複製

因此,我們要改變 p 的背景色,就可以這樣做:

ngAfterViewInit() {
    this.renderer.setStyle(this.demop.nativeElement, &#39;background-color&#39;, &#39;red&#39;); // 通过Renderer2设置p的css样式background-color
}
登入後複製
登入後複製

                               


在《Angular開發實踐(六):服務端渲染》這篇文章的最後,我們也提到了在服務端渲染中需要牢記的幾件事件,其中就包括不要使用windowdocumentnavigator等瀏覽器特有的類型以及直接操作DOM元素。

這樣就引出了 Angular 主要特性之一:橫跨所有平台。透過適當的方法,使用 Angular 建構的應用,可重複使用在多種不同平台的應用上 —— Web、行動 Web、行動應用、原生應用程式和桌面原生應用程式。

為了能夠支援跨平台,Angular 透過抽象層封裝了不同平台的差異。例如定義了抽象類別 Renderer2 、抽象類別 RootRenderer 等。另外也定義了以下參考類型:ElementRef、TemplateRef、ViewRef 、ComponentRef 和 ViewContainerRef 等。透過 模板變數@ViewChild 等方法取得DOM元素。

為了示範,先定義一個元件DemoComponent:

import { AfterViewInit, Component, ElementRef, Renderer2, ViewChild } from &#39;@angular/core&#39;;

@Component({
    template: `
        <p id="demop" #demop>this is p!</p>
        p的id:{{demop.id}} <!-- p的id:demop -->
    `
})
export class DemoComponent implements AfterViewInit {
    @ViewChild(&#39;demop&#39;) demop: ElementRef; // @ViewChild通过模板变量名获取

    constructor(private renderer: Renderer2) {
    }

    ngAfterViewInit() {
        console.log(&#39;p的id:&#39; + this.demop.nativeElement.id); // p的id:demop
        this.renderer.setStyle(this.demop.nativeElement, &#39;background-color&#39;, &#39;red&#39;); // 通过Renderer2设置p的css样式background-color
    }
}
登入後複製
登入後複製

取得元件中的p

在Angular應用程式中不應該透過原生API 或jQuery 直接取得DOM元素:

let element1 = document.getElementById("demop"); // jQuery获取: $(&#39;#demop&#39;)
登入後複製

而是應該透過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(&#39;demop&#39;) demop: ElementRef; // @ViewChild通过模板变量名获取

ngAfterViewInit() {
    console.log(&#39;p的id:&#39; + 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: &#39;window&#39; | &#39;document&#39; | &#39;body&#39; | any, eventName: string, callback: (event: any) => boolean | void): () => void // 注册事件
}
登入後複製
登入後複製

因此,我們想要改變p 的背景色,就可以這樣做:

ngAfterViewInit() {
    this.renderer.setStyle(this.demop.nativeElement, &#39;background-color&#39;, &#39;red&#39;); // 通过Renderer2设置p的css样式background-color
}
登入後複製
登入後複製


##相關建議:

Angular開發實務(五):深入解析變更監控#

Angular開發實踐(六):服務端渲染

Angular開發實踐(一):環境準備與框架建構

#

以上是Angular開發實務(七): 跨平台操作DOM及渲染器Renderer2的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1280
29
C# 教程
1257
24
如何在Ubuntu 24.04上安裝Angular 如何在Ubuntu 24.04上安裝Angular Mar 23, 2024 pm 12:20 PM

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

Go語言GUI開髮指南:實現跨平台介面設計 Go語言GUI開髮指南:實現跨平台介面設計 Mar 22, 2024 pm 02:00 PM

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

Linux Deploy的操作步驟及注意事項 Linux Deploy的操作步驟及注意事項 Mar 14, 2024 pm 03:03 PM

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

華為Mate60 Pro截圖操作步驟分享 華為Mate60 Pro截圖操作步驟分享 Mar 23, 2024 am 11:15 AM

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

Angular元件及其顯示屬性:了解非block預設值 Angular元件及其顯示屬性:了解非block預設值 Mar 15, 2024 pm 04:51 PM

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

PHP跨平台開發的未來趨勢與技術展望 PHP跨平台開發的未來趨勢與技術展望 Jun 02, 2024 pm 05:29 PM

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

Astar質押原理、收益拆解、空投項目及策略 & 操作保姆級攻略 Astar質押原理、收益拆解、空投項目及策略 & 操作保姆級攻略 Jun 25, 2024 pm 07:09 PM

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

C++ 函式如何促進跨平台 GUI 開發? C++ 函式如何促進跨平台 GUI 開發? Apr 26, 2024 pm 12:18 PM

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

See all articles