ng-template 使用过程中参数传递错误的单步调试

简介: ng-template 使用过程中参数传递错误的单步调试

本文涉及到的代码,位于这个 Github 仓库:https://github.com/wangzixi-diablo/ngDynamic

问题描述

我使用如下代码,期望在使用 *ngTemplateOutlet 指令动态创建 template 实例时,能够进行参数传递

<ng-template #inputTemplateWithContent let-param let-name="name">
    <div>参数1: {{param}}</div>
    <div>参数2: {{name}}</div>
</ng-template>
<ng-container *ngTemplateOutlet="inputTemplateWithContent; context: myContext"></ng-container>
<br>

image.png传递的参数 myContext 定义在 Component class 里:

image.png

问题在于,运行时第一个 div 元素里,显示的值是空的:

image.png

问题分析

我们还是采取单步调试的方式来查找问题:

1.png

因为 ng-template 并不会直接出现在最终渲染的 HTML 代码里,而是将其内部包裹的 HTML 原生标签,使用浏览器原生的 native API appendChild,动态插入到 DOM 树中。如下图所示:

2.png

comment 元素采取 createComment 方法创建:

3.png

node_value 是 container,这也是最后在 Chrome 开发者工具 elements 标签页里观察到的 container

4.png

5.png

动态创建了 div 元素:

6.png

这个 div 元素目前还是空的:

7.png

也就是 ng-template 里被包裹的元素:

image.png

上述代码被执行后,我们在 Chrome 开发者工具里看到了一个空的 div 标签:

8.png同理,第二个 div 标签也生成了:

image.png

我们可以使用一个小技巧:将 myContext 替换成一个 get 函数,这样我们就可以在 get 函数里设置断点进行调试,从而找到 template 上下文参数传递的准确代码位置了。

image.png

图中高亮的上下文栈帧,直接跳转到了我们编写的 get 函数:

9.png

如图:

10.png

解决方案

将模板变量参数传递修改为如下代码:

<ng-template #inputTemplateWithContent let-param11="param" let-name="name">
    <div>参数1: {{param11}}</div>
    <div>参数2: {{name}}</div>
</ng-template>

image.png

注意,我们使用关键字 let-param11定义了一个新的仅仅能在该模板内部使用的临时变量param11.

目录
相关文章
|
Web App开发 JavaScript API
ng-template 使用过程中参数传递错误的单步调试
ng-template 使用过程中参数传递错误的单步调试
|
11月前
|
开发框架 .NET C#
如何调试 C# Emit 生成的动态代码?
如何调试 C# Emit 生成的动态代码?
|
12月前
|
Web App开发 缓存 JSON
35 # 模块的断点调试 require 语法实现过程
35 # 模块的断点调试 require 语法实现过程
47 0
|
JSON JavaScript 数据格式
ng-template 使用过程中默认参数不能按照期望工作的问题单步调试
ng-template 使用过程中默认参数不能按照期望工作的问题单步调试
SAP UI5 setProperty 的执行逻辑单步调式和分析
SAP UI5 setProperty 的执行逻辑单步调式和分析
|
Web App开发
关于 ng-template 通过 @input 传入另一个 Component 不能工作的问题调试
关于 ng-template 通过 @input 传入另一个 Component 不能工作的问题调试
|
Web App开发 JavaScript 前端开发
八、通过断点调试观察JS执行过程
利用chrome开发者工具中的断点调试,我们能够一步步观察JavaScript的执行过程,直观感知函数调用栈、作用域链、变量对象、闭包、this等关键信息的变化。因此,断点调试对于快速定位代码错误,以及快速了解代码的执行过程有着非常重要的作用,这也是我们前端开发必不可少的一个高级技能。 当然如果你对JavaScript的基础概念(执行上下文,变量对象,闭包,this等)了解还不够的话,想要透彻掌握断点调试可能会有一些困难。好在前面几篇文章中,我都对这些概念进行了详细的概述,因此要掌握这个技能,对大家来说,应该是比较轻松的。
400 0
八、通过断点调试观察JS执行过程
fixture.detectChange开始单步调试,如何执行到Directive的ngAfterViewInit钩子
fixture.detectChange开始单步调试,如何执行到Directive的ngAfterViewInit钩子
fixture.detectChange开始单步调试,如何执行到Directive的ngAfterViewInit钩子
rxjs pipe和filter组合的一个实际例子的单步调试
rxjs pipe和filter组合的一个实际例子的单步调试
256 0
rxjs pipe和filter组合的一个实际例子的单步调试