通过单步调试的方式学习 Angular 中带有选择器的内容投影使用方式

简介: 通过单步调试的方式学习 Angular 中带有选择器的内容投影使用方式

问题描述

我创建了一个 selector 为 app-content-section 的 Component,用于容纳内容投影(content projection):

这个 Component 的模板区域,分别定义了三个 div 区域,里面包含了对应的内容投影占位符 ng-content:


第一个绿色区域接收所有 div 标签,第二个蓝色区域接收所有包含了 css class content-class 的标签,第三个区域接收所有 name 属性值为 test 的标签。

我们来看看消费这个 Component 的代码:

<app-content-section>
    <div name="test">div[name="test"]</div>
    <div>纯粹的 div 标签</div>
    <p #six class="content-class">p 标签,包含 [class="content-class] 和 six id</p>
    <p name="test">p 标签 [name="test"]</p>
</app-content-section>
  • app-content-section 中包含两个 div 元素,故最后的绿色区域里,包含了两个 div 值:

蓝色区域内只显示了一个 p 标签,因为这是消费者传入的元素里,唯一一个带有 content-class 类的元素。


接下来的问题是,消费者传入的元素里,第一个 div 元素和最后一个 p 元素的 name 属性值都为 test,为什么只有最后一个 p 标签,被投影到 app-content-section 里呢?

问题分析

第一个 div 标签同时满足第一条和第三条内容投影规则,因此其被投影到第一个 ng-content 之后,就不会再重复被投影了。

我们可以做一个测试,把提供内容投影场所的 Component 内的第一个和第三个 ng-content 调换一下顺序:

这次的测试结果,红色区域出现的两个元素,其 name 属性值都为 test. 而虽然绿色区域容纳的是被投射的 div 元素,但是因为 name = test 的 div 元素,已经被优先投射到红色区域,所以它不会再被重复投射了。

总结

通过单步调试 Angular content projection 的相关代码,也能确认上述逻辑。

当 Component 的模板文件被解析,遇到 ng-content 时:

触发 ɵɵprojection 函数。

applyProjectionRecursive 函数里的 nodeToProject,就是需要被投影的 DOM 节点:


可以看到这里只有包含了 name = test 属性值的 div 被 Angular 框架解析成需要被投影的节点。

相关文章
关于 Angular view Query 的 id 选择器问题的单步调试
关于 Angular view Query 的 id 选择器问题的单步调试
|
9月前
|
JavaScript
Angular 内容投影出现 No provider for TemplateRef found 错误的单步调试
Angular 内容投影出现 No provider for TemplateRef found 错误的单步调试
|
9月前
|
存储 JavaScript 前端开发
通过单步调试的方式学习 Angular 中 TView 和 LView 的概念
通过单步调试的方式学习 Angular 中 TView 和 LView 的概念
|
2月前
|
存储 前端开发 API
浅谈 Angular 应用前端消息显示机制的一个实际需求
浅谈 Angular 应用前端消息显示机制的一个实际需求
|
2月前
|
设计模式 JavaScript 前端开发
什么是 Angular 应用里的 Custom provider
什么是 Angular 应用里的 Custom provider
|
2月前
|
JavaScript 前端开发 架构师
Angular进阶:理解RxJS在Angular应用中的高效运用
RxJS(Reactive Extensions for JavaScript)是JavaScript的一个响应式编程库,特别适用于处理异步数据流。
35 0
|
2月前
|
JavaScript 前端开发
Angular.js 应用中数据模式的删除操作实现
Angular.js 应用中数据模式的删除操作实现
|
2月前
|
存储 JavaScript 前端开发
Angular 应用 node_modules 子文件夹 @types 的作用介绍
Angular 应用 node_modules 子文件夹 @types 的作用介绍
|
7天前
|
JavaScript 前端开发 开发者
Angular框架:企业级Web应用的强大后盾
Angular,谷歌支持的JavaScript框架,因其组件化架构、双向数据绑定、依赖注入和路由系统,成为企业级Web开发首选。组件化促进代码重用,如`AppComponent`示例。双向数据绑定简化DOM操作,减少手动工作。依赖注入通过示例展示易管理依赖,提升测试性。路由则支持SPA开发,平滑页面过渡。Angular的特性增强了开发效率和应用质量,使其在Web开发领域保持领先地位。【6月更文挑战第25天】
15 2
|
2月前
|
前端开发 JavaScript 测试技术
使用Angular构建高效单页应用的实践指南
【5月更文挑战第21天】本文是使用Angular构建高效单页应用的实践指南,涵盖了Angular框架简介、SPA构建步骤和最佳实践。首先,Angular是基于TypeScript的前端框架,提供声明式模板、组件化和路由管理等功能。构建SPA包括环境搭建、创建组件、编写路由、数据绑定和交互,以及构建和部署。实践中,应遵循Angular风格指南,使用Angular Material UI库,实现服务端渲染,并进行性能优化和测试,以提升应用性能和用户体验。

相关实验场景

更多