返回顶部
首页 > 资讯 > 前端开发 > html >Angular中与视图有关的定义有哪些
  • 933
分享到

Angular中与视图有关的定义有哪些

2024-04-02 19:04:59 933人浏览 泡泡鱼
摘要

这篇文章主要介绍了angular中与视图有关的定义有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Angular中与视图有关的定义有哪些文章都会有所收获,下面我们一起来看看

这篇文章主要介绍了angular中与视图有关的定义有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Angular中与视图有关的定义有哪些文章都会有所收获,下面我们一起来看看吧。

Angular中与视图有关的定义有哪些

Angular 中的视图抽象

Angular 版本可在不同的平台上运行:在浏览器中、在移动平台上或在 WEB Worker 中。因此,需要特定级别的抽象来介于平台特定的 api框架接口之间。

Angular 中通过抽象封装了不同平台的差异,并以下列引用类型的形式出现:ElementRefTemplateRefViewRefComponentRefViewContainerRef

各抽象类视图定义

在阅读源码的时候,如果不清楚这些定义之间的区别,很容易搞混淆。所以,这里我们先来理解下它们之间的区别。

元素 ElementRef

ElementRef是最基本的抽象。如果观察它的类结构,可以看到它仅包含与其关联的本地元素:

export class ElementRef<T = any> {
  // 基础原生元素
  // 如果不支持直接访问原生元素(例如当应用程序在 Web Worker 中运行时),则为 null
  public nativeElement: T;
  constructor(nativeElement: T) {
    this.nativeElement = nativeElement;
  }
  ...
}

该 API 可用于直接访问本地 DOM 元素,可以比作document.getElementById('myId')。但 Angular 并不鼓励直接使用,尽可能使用 Angular 提供的模板和数据绑定。

模板 TemplateRef

在 Angular 中,模板用来定义要如何在 html 中渲染组件视图的代码。

模板通过@Component()装饰器与组件类类关联起来。模板代码可以作为template属性的值用内联的方式提供,也可以通过 templateUrl属性链接到一个独立的 HTML 文件。

TemplateRef对象表示的其它模板用来定义一些备用视图或内嵌视图,它们可以来自多个不同的组件。TemplateRef是一组 DOM 元素(ElementRef),可在整个应用程序的视图中重复使用:

export abstract class TemplateRef<C> {
  // 此嵌入视图的父视图中的 anchor 元素
  abstract get elementRef(): ElementRef;
  // 基于此模板实例化嵌入式视图,并将其附加到视图容器
  abstract createEmbeddedView(context: C): EmbeddedViewRef<C>;
  ...
}

就其本身而言,TemplateRef类是一个简单的类,仅包括:

  • elementRef属性:拥有对其宿主元素的引用

  • createEmbeddedView方法:它允许我们创建视图并将其引用作为ViewRef返回。

模板会把纯 HTML 和 Angular 的数据绑定语法、指令和模板表达式组合起来。Angular 的元素会插入或计算那些值,以便在页面显示出来之前修改 HTML 元素。

Angular 中的视图

在 Angular 中,视图是可显示元素的最小分组单位,它们会被同时创建和销毁。Angular 哲学鼓励开发人员将 UI 视为视图的组合(而不是独立的 html 标签树)。

组件(component) 类及其关联的模板(template)定义了一个视图。具体实现上,视图由一个与该组件相关的ViewRef实例表示。

ViewRef

ViewRef表示一个 Angular 视图:

export declare abstract class ViewRef extends ChangeDetectorRef {
    // 销毁该视图以及与之关联的所有数据结构
    abstract get destroyed(): boolean;
    // 报告此视图是否已被销毁
    abstract destroy(): void;
    // 生命周期挂钩,为视图提供其他开发人员定义的清理功能
    abstract onDestroy(callback: Function): any;
}

其中,ChangeDetectorRef提供更改检测功能的基类,用于更改检测树收集所有要检查更改的视图:

export declare abstract class ChangeDetectorRef {
    // 当输入已更改或视图中触发了事件时,通常会将组件标记为脏(需要重新渲染)
    // 调用此方法以确保即使没有发生这些触发器,也要检查组件
    abstract checkNoChanges(): void;
    // 从变更检测树中分离该视图。在重新连接分离视图之前,不会对其进行检查。
    // 与 detectChanges() 结合使用可实现本地变更检测检查
    abstract detach(): void;
    // 检查此视图及其子级,与 detach() 结合使用可实现本地更改检测检查
    abstract detectChanges(): void;
    // 检查变更检测器及其子级,如果检测到任何变更,则抛出该异常
    abstract markForCheck(): void;
    // 将先前分离的视图重新附加到变更检测树
    // 默认情况下,视图将附加到树上
    abstract reattach(): void;
}

两种类型的视图

Angular 支持两种类型的视图:

  • (1) 链接到模板(template)的嵌入式视图(embeddedView)。

嵌入式视图表示视图容器中的 Angular 视图。模板只是保存视图的蓝图,可以使用上述的createEmbeddedView方法从模板实例化视图。

  • (2) 链接到组件(component)的宿主视图(hostView)。

直属于某个组件的视图叫做宿主视图。

宿主视图是在动态实例化组件时创建的,可以使用ComponentFactoryResolver动态创建实例化一个组件。在 Angular 中,每个组件都绑定到特定的注入器实例,因此在创建组件时我们将传递当前的注入器实例。

视图中各个元素的属性可以动态修改以响应用户的操作,而这些元素的结构(数量或顺序)则不能。你可以通过在它们的视图容器(ViewContainer)中插入、移动或移除内嵌视图来修改这些元素的结构。

ViewContainerRef

ViewContainerRef是可以将一个或多个视图附着到组件中的容器:

export declare abstract class ViewContainerRef {
    // 锚元素,用于指定此容器在包含视图中的位置
    // 每个视图容器只能有一个锚元素,每个锚元素只能有一个视图容器
    abstract get element(): ElementRef;
    // 此视图容器的 DI
    abstract get injector(): Injector;
    // 此容器当前附加了多少视图
    abstract get length(): number;
    // 销毁此容器中的所有视图
    abstract clear(): void;
    // 实例化单个组件,并将其宿主视图插入此容器
    abstract createComponent<C>(componentFactory: ComponentFactory<C>, index?: number, injector?: Injector, projectablenodes?: any[][], ngModule?: NgModuleRef<any>): ComponentRef<C>;
    // 实例化一个嵌入式视图并将其插入
    abstract createEmbeddedView<C>(templateRef: TemplateRef<C>, context?: C, index?: number): EmbeddedViewRef<C>;
    // 从此容器分离视图而不销毁它
    abstract detach(index?: number): ViewRef | null;
    // 从此容器检索视图
    abstract get(index: number): ViewRef | null;
    // 返回当前容器内视图的索引
    abstract indexOf(viewRef: ViewRef): number;
    // 将视图移动到此容器中的新位置
    abstract insert(viewRef: ViewRef, index?: number): ViewRef;
    abstract move(viewRef: ViewRef, currentIndex: number): ViewRef;
    // 销毁附加到此容器的视图
    abstract remove(index?: number): void;
}

任何 DOM 元素都可以用作视图容器,Angular 不会在元素内插入视图,而是将它们附加到绑定到ViewContainer的元素之后。

通常,标记ng-container元素是标记应创建ViewContainer的位置的最佳选择。它作为注释呈现,因此不会在 DOM 中引入多余的 HTML 元素。

通过ViewContainerRef,可以用createComponent()方法实例化组件时创建宿主视图,也可以用 createEmbeddedView()方法实例化TemplateRef时创建内嵌视图。

视图容器的实例还可以包含其它视图容器,以创建层次化视图(视图树)。

视图树(View hierarchy)

在 Angular 中,通常会把视图组织成一些视图树(view hierarchies)。视图树是一棵相关视图的树,它们可以作为一个整体行动,是 Angular 变更检测的关键部件之一。

视图树的根视图就是组件的宿主视图。宿主视图可以是内嵌视图树的根,它被收集到了宿主组件上的一个视图容器(ViewContainerRef)中。当用户在应用中导航时(比如使用路由器),视图树可以动态加载或卸载。

视图树和组件树并不是一一对应的:

  • 嵌入到指定视图树上下文中的视图,也可能是其它组件的宿主视图

  • 组件可能和宿主组件位于同一个NgModule中,也可能属于其它NgModule

组件、模板、视图与模块

在 Angular 中,可以通过组件的配套模板来定义其视图。模板就是一种 HTML,它会告诉 Angular 如何渲染该组件。

视图通常会分层次进行组织,让你能以 UI 分区或页面为单位进行修改、显示或隐藏。与组件直接关联的模板会定义该组件的宿主视图。该组件还可以定义一个带层次结构的视图,它包含一些内嵌的视图作为其它组件的宿主。

Angular中与视图有关的定义有哪些

带层次结构的视图可以包含同一模块(NgModule)中组件的视图,也可以(而且经常会)包含其它模块中定义的组件的视图。

关于“Angular中与视图有关的定义有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Angular中与视图有关的定义有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网html频道。

--结束END--

本文标题: Angular中与视图有关的定义有哪些

本文链接: https://lsjlt.com/news/89821.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Angular中与视图有关的定义有哪些
    这篇文章主要介绍了Angular中与视图有关的定义有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Angular中与视图有关的定义有哪些文章都会有所收获,下面我们一起来看看...
    99+
    2024-04-02
  • angular与react的区别有哪些
    这篇文章主要介绍了angular与react的区别有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇angular与react的区别有哪些文章都会有所收获,下面我们一起来看看...
    99+
    2024-04-02
  • angular与bootstrap的区别有哪些
    这篇文章给大家分享的是有关angular与bootstrap的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 区别:1、angular是一个...
    99+
    2024-04-02
  • mysql视图与表的区别有哪些
    本篇内容主要讲解“mysql视图与表的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql视图与表的区别有哪些”吧! ...
    99+
    2024-04-02
  • React与Angular有哪些区别
    这篇文章主要介绍“React与Angular有哪些区别”,在日常操作中,相信很多人在React与Angular有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Reac...
    99+
    2024-04-02
  • mysql中的视图语法有哪些
    这篇文章将为大家详细讲解有关mysql中的视图语法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql中的视图语法:1、创建视图,代码为【CREATE [OR ...
    99+
    2024-04-02
  • MySQL中的视图有哪些语法
    这篇文章主要讲解了“MySQL中的视图有哪些语法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中的视图有哪些语法”吧!视图是什么视图View是一种虚拟的表,本身不保存数据,内部封装...
    99+
    2023-06-02
  • oracle中的视图有哪些优点
    Oracle中的视图有以下优点:1. 简化数据查询:视图可以将复杂的查询逻辑封装起来,使得用户可以通过简单的查询语句访问需要的数据,...
    99+
    2023-08-15
    oracle
  • Django中有哪些视图类型
    这篇文章将为大家详细讲解有关Django中有哪些视图类型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、基于功能的视图基于函数的视图是使用python中的函数编写的,该函数以HttpReq...
    99+
    2023-06-14
  • 关于angular的前端面试题有哪些
    这篇文章主要介绍了关于angular的前端面试题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1,ng-if 跟 ng-show/hide 的区别有哪些?第一点区别是,...
    99+
    2023-06-14
  • mysql视图的作用有哪些
    小编给大家分享一下mysql视图的作用有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!测试表:user有id,name,ag...
    99+
    2024-04-02
  • dba_indexes视图的性能有哪些
    这篇文章主要介绍“dba_indexes视图的性能有哪些”,在日常操作中,相信很多人在dba_indexes视图的性能有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”db...
    99+
    2024-04-02
  • Angular中UI框架有哪些
    这篇文章将为大家详细讲解有关Angular中UI框架有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Angular是一个成熟的框架,其顶部设计了自己的工具和最佳实践实现。通过将它们分成可在Angula...
    99+
    2023-06-14
  • C语言中定义与声明有哪些区别
    目录一、变量的声明与定义二、函数的声明与定义三、总结一、变量的声明与定义 首先,举个简单的例子: int a; extern int b; 这里的两个变量,哪个是声明?哪个是定义?...
    99+
    2024-04-02
  • python中定义类的方法有哪些
    本篇内容主要讲解“python中定义类的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python中定义类的方法有哪些”吧!python中的3种定义类方法:普通方法类方法(@class...
    99+
    2023-06-21
  • Angular中关于单元测试的面试题有哪些
    这篇文章主要介绍了Angular中关于单元测试的面试题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Angular中的测试有哪些种,基于哪些测试框架Angular的测试...
    99+
    2023-06-15
  • Python中有哪些关键字与容器有关?
    Python是一种高级编程语言,它具有简单易学、开发效率高等特点。在Python中,关键字和容器是编程中非常重要的概念。本文将介绍Python中与容器有关的关键字,让读者更好地理解Python中的容器。 list list是Python...
    99+
    2023-06-13
    关键字 容器 数组
  • Angular中的类装饰器有哪些
    这篇文章主要介绍了Angular中的类装饰器有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。angular共有5种类装饰器,表明每个类的...
    99+
    2024-04-02
  • php中预定义常量有哪些
    php中常见的预定义常量有以下几种PDO::FETCH_LAZY()php中PDO::FETCH_LAZY()的作用是将结果集中的每一行作为对象返回,且对象的变量名对应着列名,常使用PDO::FETCH_LAZY来创建访问的对象变量名。PD...
    99+
    2024-04-02
  • html5中有哪些自定义属性
    今天就跟大家聊聊有关html5中有哪些自定义属性,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 定义H5为我们提供了以 "data-" 为前缀定义需要的...
    99+
    2023-06-09
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作