찾다
웹 프론트엔드JS 튜토리얼Angular4에서 ElementRef를 사용하는 방법

이번에는 Angular4에서 ElementRef를 사용하는 방법을 보여드리겠습니다. Angular4에서 ElementRef를 사용할 때 notes는 무엇인가요? 다음은 실제 사례입니다. 살펴보겠습니다.

Angular의 슬로건은 - "하나의 프레임워크, 다중 플랫폼. 모바일과 데스크톱 모두에 적합합니다. (One Framework.Mobile & 데스크탑.)" 즉, Angular는 웹 애플리케이션, 모바일 웹 애플리케이션, 기본 모바일 애플리케이션, 기본 데스크톱 애플리케이션 등과 같은 크로스 플랫폼 애플리케이션의 개발을 지원합니다.

크로스 플랫폼을 지원하기 위해 Angular는 추상화 계층을 통해 다양한 플랫폼의 차이점을 캡슐화하고 API 인터페이스를 통합합니다. 예를 들어 추상 클래스인 Renderer와 추상 클래스 RootRenderer 등 또한 ElementRef, TemplateRef, ViewRef, ComponentRef와 같은 참조 유형이 정의됩니다. 및 ViewContainerRef 등 ElementRef 클래스를 분석해 보겠습니다.

ElementRef의 역할

애플리케이션 계층에서 DOM을 직접 조작하면 애플리케이션 계층과 렌더링 계층 사이에 강한 결합이 발생하여 웹 작업자와 같은 다른 환경에서 애플리케이션을 실행할 수 없게 됩니다. 작업자 환경에서는 DOM을 직접 조작할 수 없습니다. 관심 있는 독자는 Web Workers에서 지원되는 클래스와 메서드를 읽어볼 수 있습니다. 통과하다 ElementRef를 사용하면 다양한 플랫폼의 뷰 레이어에 있는 기본 요소를 캡슐화할 수 있습니다(브라우저 환경에서 기본 요소는 일반적으로 DOM을 참조함). 요소) 그리고 마지막으로 Angular에서 제공하는 강력한 Dependency Insertion 기능을 사용하면 기본 요소에 쉽게 액세스할 수 있습니다.

ElementRef 정의

export class ElementRef {
 public nativeElement: any;
 constructor(nativeElement: any) { this.nativeElement = nativeElement; }
}

ElementRef

적용 먼저 전체 요구 사항을 소개하겠습니다. 페이지에서 p 요소를 가져오고 페이지가 성공적으로 렌더링된 후 p 요소의 배경색을 변경하려고 합니다. 다음으로 이 요구 사항을 단계별로 구현하겠습니다.

먼저 p 요소를 가져와야 합니다. 기사의 "ElementRef 역할" 섹션에서 Angular를 사용할 수 있다고 언급했습니다. 캡슐화된 기본 요소를 얻기 위한 강력한 종속성 주입 기능을 제공합니다. 브라우저에서 기본 요소는 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 개체가 존재하지만 해당 하위 요소를 찾을 수 없습니다. constructor가 호출될 때 my-app이어야 합니다. 요소 아래의 하위 요소가 아직 생성되지 않았습니다. 그렇다면 이 문제를 해결하는 방법은 무엇입니까? 생각해보니... setTimeout이 좀 개선된 것 아닌가요?

 constructor(private elementRef: ElementRef) {
 setTimeout(() => { // 此处需要使用箭头函数哈,你懂的...
   let pEle = this.elementRef.nativeElement.querySelector('p');
   console.dir(pEle);
  }, 0); }

문제가 해결되었지만 그다지 우아하지 않습니까? 더 나은 해결책이 있습니까? 대답은 '예'입니다. Angular는 구성 요소의 수명 주기에 대한 후크를 제공하지 않으며 적절한 시간을 선택하고 원하는 p 요소를 얻을 수 있습니다. rreee 위 코드를 실행하면 예상되는 p 요소가 표시됩니다. ngAfterViewInit을 직접 사용합니다. 왜 이 고리가 눈에 가장 좋기 때문에 나에게 묻지 마십시오. 하지만 나중에 Angular 구성 요소의 수명 주기를 자세히 분석하는 특별 기사도 준비하겠습니다. 성공적으로 p를 획득했습니다. 요소의 경우 나머지는 스타일 개체를 통해 직접 요소의 배경색을 설정하는 것이 쉽습니다.

기능이 구현됐지만 아직 최적화의 여지가 있나요?

rreee

즉시 기분이 좋아지지 않나요? 그런데 잠깐만요. 위 코드에 추가로 최적화할 여지가 있나요? 우리는 그 설정 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'; }
}

1.Renderer API에는 일반적으로 사용되는 다른 메소드가 있습니까?

rreee

Angular 4.x+ 버전에서는 Renderer(Angular V2) 대신 Renderer2를 사용한다는 점에 유의해야 합니다.

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中文网其它相关文章!

推荐阅读:

Immutable.js怎样实现撤销重做效果

vue判断input输入内容有否有空格

FileReader实现上传图片之前本地先预览

위 내용은 Angular4에서 ElementRef를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php如何使用PHP的Intl扩展?php如何使用PHP的Intl扩展?May 31, 2023 pm 08:10 PM

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

如何使用CakePHP中的数据库查询构造器?如何使用CakePHP中的数据库查询构造器?Jun 04, 2023 am 09:02 AM

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

php如何使用CI框架?php如何使用CI框架?Jun 01, 2023 am 08:48 AM

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

php如何使用PHP的Ctype扩展?php如何使用PHP的Ctype扩展?Jun 03, 2023 pm 10:40 PM

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

Vue 中的单文件组件是什么,如何使用?Vue 中的单文件组件是什么,如何使用?Jun 10, 2023 pm 11:10 PM

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

php如何使用CI4框架?php如何使用CI4框架?Jun 01, 2023 pm 02:40 PM

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

php如何使用PHP的socket编程功能?php如何使用PHP的socket编程功能?Jun 03, 2023 pm 09:51 PM

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

php如何使用PHP的DOM扩展?php如何使用PHP的DOM扩展?May 31, 2023 pm 06:40 PM

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

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!