问题描述

我使用如下代码测试一个最简单的 Angular 内容投影场景:

import { Component } from '@angular/core';@Component({selector: 'app-zippy-basic',template: `<h2>Single-slot content projection</h2><ng-container></ng-container>`
})
export class ZippyBasicComponent {}

我期望 app-zippy-basic 的使用者,将传入的 content,投射到元素 ng-container 内部。

消费代码如下图所示:

<app-zippy-basic><p>Is content projection cool?</p><div>ok</div>
</app-zippy-basic>

然而运行时,我在渲染出的页面里,根本看不到 Is content projection cool? 的显示。

问题分析

打开 Chrome 开发者工具,发现 app-zippy-basic 内部只有一个 comment 节点:ng-container

我们在提供内容投影插槽的 Component 的 ng-container 之间随便键入一些字符串,例如 DIV:

渲染后发现,ng-container 没能按照我们期望的工作。

通过查阅 Angular 官网,发现这里把 ng-container 和 ng-content 弄混淆了。此处应该使用 ng-content.

解决方案

ng-content 之间不允许再插入其他元素。仅仅充当一个占位符的角色。

使用 ng-content 之后问题消失。这里我们可以通过单步调试的方式,搞清楚被投影的内容是如何插入到 ng-content 占位符里的。

选择 app-zippy-basic,给其设置一个 dom 断点,类型为 subtree modification

首先执行 template 函数,将 Component 本身的 h2 元素,进行 HTML 源代码的渲染:

接下来是 Angular 处理整个内容投影逻辑的关键:

遇到 ng-content,则调用函数 ɵɵprojection

转而调用 applyProjection

parent node 即是指定义了 ng-content 的 Component 对应的 dom 元素:

rNode 即是被插入到 app-zippy-basic 中的节点,即 app-zippy-basic 的消费者。

消费语法:

<app-zippy-basic>
此处插入你想投影到 app-zippy-basic 内部的 HTML 源代码
</app-zippy-basic>

Angular 内容投影 content projection 的一个问题的单步调试相关推荐

  1. Angular 内容投影 content projection 关于选择器问题的单步调试

    问题描述 我定义了一个能够允许消费者 Component 将其自定义内容通过 content projection 投射进来的 Component: import { Component } from ...

  2. Angular 内容投影 content projection 关于条件渲染问题的单步调试

    问题描述 本文涉及到的代码位置:https://github.com/wangzixi-diablo/ngDynamic ng-container 和 ngTemplateOutlet 的配合使用. ...

  3. Angular 基于自定义指令的内容投影 content projection 问题的单步调试

    问题描述 本文涉及到的代码位置:https://github.com/wangzixi-diablo/ngDynamic 我有一个能接受内容投影的 Angular Component: 具体投影内容, ...

  4. Angular 内容投影 II

    内容投影是一种模式,你可以在其中插入或投影要在另一个组件中使用的内容. 简单来说,angular的内容投影就相当于vue的内容插槽slot.所有一下就能懂了. 1.单插槽内容投影 单插槽内容投影是指创 ...

  5. Angular 内容投影出现 No provider for TemplateRef found 错误的单步调试

    问题描述 本文涉及到的代码位置:https://github.com/wangzixi-diablo/ngDynamic 我有一个能接受内容投影的 Angular Component: 使用如下代码消 ...

  6. angular 内容投影

    app HTML <div class="wrapper"><h2>我是父组件</h2><div>这个div定义在父组件中</ ...

  7. Angular里interpolation text节点的创建逻辑,单步调试

    通过一个例子来学习: 新建一个Component,只包含一个名为hero的属性,包含一个name字段,值为Jerry: export class AppComponent implements OnI ...

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

    问题描述 我创建了一个 selector 为 app-content-section 的 Component,用于容纳内容投影(content projection): 这个 Component 的模 ...

  9. 使用Angular可重用Component思路实现一个自带图标(icon)的input控件

    参考链接:Angular ng-content and Content Projection: A Complete Guide - How To Use ng-content To Improve ...

最新文章

  1. Freebsd10上部署open*** 服务器
  2. pytorch 指定层学习率
  3. php 命名空间地址,php命名空间简介
  4. EF映射字段类型不一致
  5. Pixhawk-串级pid介绍
  6. ASP.NET MVC3 部署的前期工作
  7. yolov5s 目标检测模型实战——火点烟雾检测实战
  8. 创建用户, 使用crontab定时运行程序
  9. Linux查看服务器自动关机,Linux系统自动关机的命令详解
  10. 120个绝对经典的电脑技巧
  11. 数据库课设之学生信息管理系统
  12. 微信企业者开发接口文档
  13. LaTex 常用的数学字体
  14. C#毕业设计——基于C#+asp.net+ACCESS的电子商务网站设计与实现(毕业论文+程序源码)——电子商务网站
  15. fiddler提示the system proxy was changed,Click to reanable capturing.导致无法抓包
  16. Xavier NX+KU040图像处理卡
  17. python答题搜索_python实现百万答题自动百度搜索答案
  18. java+生成drl文件_java-如何在运行时使drools drl文件访问更新的jar
  19. Pygame 官方文档 - pygame.cursors
  20. 【AI测试】也许这有你想知道的人工智能 (AI) 测试--开篇

热门文章

  1. Navcat:解决1251 client does not support authentication ...问题
  2. t3 修改服务器配置,t3如何修改服务器地址
  3. c语言中if条件语句说课内容,if语句-ppt-说课--试讲-C语言.ppt
  4. firebird 行级锁问题_MySQL 锁
  5. mysql sql字符串连接函数_Mysql字符串连接函数 CONCAT()与 CONCAT_WS()
  6. IDEA下的使用git
  7. mybatis框架总体说明---Mybatis学习笔记(二)
  8. SSH服务--Linux学习笔记
  9. 关于数据可视化的思考小结
  10. java学习之路--面试之多线程基础