這次帶給大家Angular4裡ElementRef的使用方法,Angular4裡ElementRef使用的注意事項有哪些,下面就是實戰案例,一起來看一下。
Angular 的口號是 - "一套框架,多種平台。同時適用手機與桌面 (One framework.Mobile & desktop.)",即 Angular 是支援開發跨平台的應用,例如:Web 應用、行動 Web 應用、原生行動應用程式和原生桌面應用程式等。
為了能夠支援跨平台,Angular 透過抽象層封裝了不同平台的差異,統一了 API 介面。如定義了抽象類別 Renderer 、抽象類別 RootRenderer 等。另外也定義了以下參考類型:ElementRef、TemplateRef、ViewRef 、ComponentRef 和 ViewContainerRef 等。下面我們就來分析一下 ElementRef 類別:
ElementRef的作用
# 在應用層直接操作 DOM,就會造成應用層與渲染層之間強耦合,導致我們的應用無法運作在不同環境,如 web worker 中,因為在 web worker 環境中,是不能直接操作 DOM。有興趣的讀者,可以閱讀 Web Workers 中支援的類別和方法 這篇文章。透過 ElementRef 我們就可以封裝不同平台下視圖層中的 native 元素 (在瀏覽器環境中,native 元素通常是指 DOM 元素),最後借助 Angular 提供的強大的依賴注入特性,我們就可以輕鬆地存取到 native 元素。
ElementRef的定義
export class ElementRef { public nativeElement: any; constructor(nativeElement: any) { this.nativeElement = nativeElement; } }
ElementRef的應用程式
我們先來介紹整體需求,我們想在頁面成功渲染後,取得頁面中的 p 元素,並改變該 p 元素的背景顏色。接下來我們來一步步,實現這個需求。
首先我們要先取得 p 元素,在文中 "ElementRef 的作用" 部分,我們已經提到可以利用 Angular 提供的強大的依賴注入特性,取得封裝後的 native 元素。在瀏覽器中 native 元素就是 DOM 元素,我們只要先取得 my-app元素,然後利用 querySelector API 就能取得頁面中 p 元素。具體程式碼如下:
import { Component, ElementRef } from '@angular/core'; @Component({ selector: 'my-app', template: ` <h1 id="Welcome-to-Angular-World">Welcome to Angular World</h1> <p>Hello {{ name }}</p> `, }) export class AppComponent { name: string = 'Semlinker'; constructor(private elementRef: ElementRef) { let pEle = this.elementRef.nativeElement.querySelector('p'); console.dir(pEle); } }
執行上面程式碼,在控制台中沒有出現異常,但是輸出的結果卻是 null 。什麼情況 ? 沒有拋出異常,我們可以推斷 this.elementRef.nativeElement 這個物件是存在,但卻找不到它的子元素,那應該是在呼叫建構子的時候,my-app 元素下的子元素尚未建立。那要怎麼解決這個問題呢 ?沉思中… ,不是有 setTimeout 麼,我們在稍微改造一下:
constructor(private elementRef: ElementRef) { setTimeout(() => { // 此处需要使用箭头函数哈,你懂的... let pEle = this.elementRef.nativeElement.querySelector('p'); console.dir(pEle); }, 0); }
問題解決了,但感覺不是很優雅 ?有沒有更好的方案,答案是肯定的。 Angular 不是有提供元件生命週期的鉤子,我們可以選擇一個合適的時機,然後取得我們想要的 p 元素。
import { Component, ElementRef, AfterViewInit } from '@angular/core'; @Component({ selector: 'my-app', template: ` <h1 id="Welcome-to-Angular-World">Welcome to Angular World</h1> <p>Hello {{ name }}</p> `, }) export class AppComponent { name: string = 'Semlinker'; // 在构造函数中 this.elementRef = elementRef 是可选的,编译时会自动赋值 // function AppComponent(elementRef) { this.elementRef = elementRef; } constructor(private elementRef: ElementRef) { } ngAfterViewInit() { // 模板中的元素已创建完成 console.dir(this.elementRef.nativeElement.querySelector('p')); // let greetp: HTMLElement = this.elementRef.nativeElement.querySelector('p'); // greetp.style.backgroundColor = 'red'; } }
運行一下上面的程式碼,我們看到了意料中的 p 元素。我們直接選用 ngAfterViewInit 這個鉤子,不要問我為什麼,因為它看得最順眼咯。不過我們後面也會有專門的文章,詳細分析 Angular 組件的生命週期。成功取到 p 元素,就剩下的事情就好辦了,直接透過 style 物件設定元素的背景顏色。
功能雖然已經實現了,但還有優化的空間麼?
import { Component, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; @Component({ selector: 'my-app', template: ` <h1 id="Welcome-to-Angular-World">Welcome to Angular World</h1> <p>Hello {{ name }}</p> `, }) export class AppComponent { name: string = 'Semlinker'; @ViewChild('greet') greetp: ElementRef; ngAfterViewInit() { this.greetp.nativeElement.style.backgroundColor = 'red'; } }
是不是感覺瞬間高大上了,不過先等等,上面的程式碼是不是還有進一步的優化空間呢 ?我們看到設定 p 元素的背景,我們是預設應用的運行環境在是瀏覽器中。前面已經介紹了,我們要盡量減少應用層與渲染層之間強耦合關係,讓我們應用能夠靈活地運行在不同環境中。最後我們來看一下,最終優化後的程式碼:
import { Component, ElementRef, ViewChild, AfterViewInit, Renderer } from '@angular/core'; @Component({ selector: 'my-app', template: ` <h1 id="Welcome-to-Angular-World">Welcome to Angular World</h1> <p>Hello {{ name }}</p> `, }) export class AppComponent { name: string = 'Semlinker'; @ViewChild('greet') greetp: ElementRef; constructor(private elementRef: ElementRef, private renderer: Renderer) { } ngAfterViewInit() { // this.greetp.nativeElement.style.backgroundColor = 'red'; this.renderer.setElementStyle(this.greetp.nativeElement, 'backgroundColor', 'red'); } }
1.Renderer API 還有哪些常用的方法 ?
export abstract class Renderer { // 创建元素 abstract createElement(parentElement: any, name: string, debugInfo?: RenderDebugInfo): any; // 创建文本元素 abstract createText(parentElement: any, value: string, debugInfo?: RenderDebugInfo): any; // 设置文本 abstract setText(renderNode: any, text: string): void; // 设置元素Property abstract setElementProperty(renderElement: any, propertyName: string, propertyValue: any): void; // 设置元素Attribute abstract setElementAttribute(renderElement: any, attributeName: string, attributeValue: string): void; // 设置元素的Class abstract setElementClass(renderElement: any, className: string, isAdd: boolean): void; // 设置元素的样式 abstract setElementStyle(renderElement: any, styleName: string, styleValue: string): void; }
要注意的是在 Angular 4.x 版本,我們使用 Renderer2 取代 Renderer (Angular V2)。
2.Renderer2 API 还有哪些常用的方法 ?
export abstract class Renderer2 { abstract createElement(name: string, namespace?: string|null): any; abstract createComment(value: string): any; abstract createText(value: string): any; abstract setAttribute(el: any, name: string, value: string, namespace?: string|null): void; abstract removeAttribute(el: any, name: string, namespace?: string|null): void; abstract addClass(el: any, name: string): void; abstract removeClass(el: any, name: string): void; abstract setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2): void; abstract removeStyle(el: any, style: string, flags?: RendererStyleFlags2): void; abstract setProperty(el: any, name: string, value: any): void; abstract setValue(node: any, value: string): void; abstract listen( target: 'window'|'document'|'body'|any, eventName: string, callback: (event: any) => boolean | void): () => void; }
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是Angular4裡ElementRef的使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHP的Intl扩展是一个非常实用的工具,它提供了一系列国际化和本地化的功能。本文将介绍如何使用PHP的Intl扩展。一、安装Intl扩展在开始使用Intl扩展之前,需要安装该扩展。在Windows下,可以在php.ini文件中打开该扩展。在Linux下,可以通过命令行安装:Ubuntu/Debian:sudoapt-getinstallphp7.4-

CakePHP是一个开源的PHPMVC框架,它广泛用于Web应用程序的开发。CakePHP具有许多功能和工具,其中包括一个强大的数据库查询构造器,用于交互性能数据库。该查询构造器允许您使用面向对象的语法执行SQL查询,而不必编写繁琐的SQL语句。本文将介绍如何使用CakePHP中的数据库查询构造器。建立数据库连接在使用数据库查询构造器之前,您首先需要在Ca

随着网络技术的发展,PHP已经成为了Web开发的重要工具之一。而其中一款流行的PHP框架——CodeIgniter(以下简称CI)也得到了越来越多的关注和使用。今天,我们就来看看如何使用CI框架。一、安装CI框架首先,我们需要下载CI框架并安装。在CI的官网(https://codeigniter.com/)上下载最新版本的CI框架压缩包。下载完成后,解压缩

PHP是一种非常受欢迎的编程语言,它允许开发者创建各种各样的应用程序。但是,有时候在编写PHP代码时,我们需要处理和验证字符。这时候PHP的Ctype扩展就可以派上用场了。本文将就如何使用PHP的Ctype扩展展开介绍。什么是Ctype扩展?PHP的Ctype扩展是一个非常有用的工具,它提供了各种函数来验证字符串中的字符类型。这些函数包括isalnum、is

作为一种流行的前端框架,Vue能够提供开发者一个便捷高效的开发体验。其中,单文件组件是Vue的一个重要概念,使用它能够帮助开发者快速构建整洁、模块化的应用程序。在本文中,我们将介绍单文件组件是什么,以及如何在Vue中使用它们。一、单文件组件是什么?单文件组件(SingleFileComponent,简称SFC)是Vue中的一个重要概念,它

PHP是一种广泛使用的服务器端脚本语言,而CodeIgniter4(CI4)是一个流行的PHP框架,它提供了一种快速而优秀的方法来构建Web应用程序。在这篇文章中,我们将通过引导您了解如何使用CI4框架,来使您开始使用此框架来开发出众的Web应用程序。1.下载并安装CI4首先,您需要从官方网站(https://codeigniter.com/downloa

PHP是一门广泛应用于Web开发的编程语言,支持许多网络编程应用。其中,Socket编程是一种常用的实现网络通讯的方式,它能够让程序实现进程间的通讯,通过网络传输数据。本文将介绍如何在PHP中使用Socket编程功能。一、Socket编程简介Socket(套接字)是一种抽象的概念,在网络通信中代表了一个开放的端口,一个进程需要连接到该端口,才能与其它进程进行

PHP的DOM扩展是一种基于文档对象模型(DOM)的PHP库,可以对XML文档进行创建、修改和查询操作。该扩展可以使PHP语言更加方便地处理XML文件,让开发者可以快速地实现对XML文件的数据分析和处理。本文将介绍如何使用PHP的DOM扩展。安装DOM扩展首先需要确保PHP已经安装了DOM扩展,如果没有安装需要先安装。在Linux系统中,可以使用以下命令来安


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Dreamweaver Mac版
視覺化網頁開發工具

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

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器