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

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

问题描述

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


    
参数1: {{param}}
参数2: {{name}}

ng-template 使用过程中参数传递错误的单步调试_第1张图片

传递的参数 myContext 定义在 Component class 里:
ng-template 使用过程中参数传递错误的单步调试_第2张图片

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

ng-template 使用过程中参数传递错误的单步调试_第3张图片

问题分析

我们还是采取单步调试的方式来查找问题:
ng-template 使用过程中参数传递错误的单步调试_第4张图片

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

ng-template 使用过程中参数传递错误的单步调试_第5张图片

comment 元素采取 createComment 方法创建:
ng-template 使用过程中参数传递错误的单步调试_第6张图片

node_value 是 container,这也是最后在 Chrome 开发者工具 elements 标签页里观察到的 container
ng-template 使用过程中参数传递错误的单步调试_第7张图片

ng-template 使用过程中参数传递错误的单步调试_第8张图片

动态创建了 div 元素:
ng-template 使用过程中参数传递错误的单步调试_第9张图片

这个 div 元素目前还是空的:
ng-template 使用过程中参数传递错误的单步调试_第10张图片

也就是 ng-template 里被包裹的元素:
ng-template 使用过程中参数传递错误的单步调试_第11张图片

上述代码被执行后,我们在 Chrome 开发者工具里看到了一个空的 div 标签:
ng-template 使用过程中参数传递错误的单步调试_第12张图片

同理,第二个 div 标签也生成了:
ng-template 使用过程中参数传递错误的单步调试_第13张图片

我们可以使用一个小技巧:将 myContext 替换成一个 get 函数,这样我们就可以在 get 函数里设置断点进行调试,从而找到 template 上下文参数传递的准确代码位置了。
ng-template 使用过程中参数传递错误的单步调试_第14张图片

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

ng-template 使用过程中参数传递错误的单步调试_第15张图片

如图:
ng-template 使用过程中参数传递错误的单步调试_第16张图片

解决方案

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


    
参数1: {{param11}}
参数2: {{name}}

ng-template 使用过程中参数传递错误的单步调试_第17张图片

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

你可能感兴趣的:(ng-template 使用过程中参数传递错误的单步调试)