通过 ID 获取 ViewChildren 模板

2024-04-22

在我的组件中,我使用 ViewChildren 获取其标记模板的列表:

@ViewChildren(TemplateRef) private _templates: QueryList<TemplateRef<unknown>>;

在 Angular8 中,我无法通过 Id 过滤它们,所以我需要寻找一个内部属性 - 这在某种程度上有点 hacky:

let template = this._templates.find(t => (<any>t)._def.references[id]) : null;

现在,有了 Angular 9,这种情况就不再适用了。我检查了该对象并发现了一个新的“黑客”:

this._templates.find(t => (<any>t)._declarationTContainer?.localNames?.includes(id)) : null;

但是对于这种情况有什么新的或干净的解决方案吗?

仍然希望有一个无需自定义指令即可工作的解决方案,例如。 MatTab 可能也会做类似的事情:

<mat-tab>
    <ng-template mat-tab-label>
        ...
    </ng-template>

    <ng-template matTabContent>
        ...
    </ng-template>
</mat-tab>

针对您的场景的一个干净的解决方案是创建一个NgTemplateNameDirective指令与ng-template[name]选择器:

import { Directive, Input, TemplateRef } from '@angular/core';

@Directive({
  selector: 'ng-template[name]'
})
export class NgTemplateNameDirective {
  @Input() name: string;

  constructor(public template: TemplateRef<any>) { }
}

之后创建模板,例如:

<ng-template name="t1"></ng-template>
<ng-template name="t2"></ng-template>

然后查询NgTemplateNameDirective代替TemplateRef:

@ViewChildren(NgTemplateNameDirective) private _templates: QueryList<NgTemplateNameDirective>;

最后按名称搜索您的模板

getTemplateRefByName(name: string): TemplateRef<any> {
  const dir = this._templates.find(dir => dir.name === name);
  return dir ? dir.template : null
}

在两种视图引擎中都可以正常工作:ViewEngine 和 Ivy.

NG 运行示例 https://ng-run.com/edit/5OGMZ08gP2Hpvk26pBDt?open=app%2Fapp.component.ts

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 ID 获取 ViewChildren 模板 的相关文章

随机推荐

  • 如何应用结构偏移?

    我有一个结构 typedef struct foo int lengthOfArray1 int lengthOfArray2 int array1 int array2 foo 我需要为整个结构及其数组的内容分配足够的内存 所以假设每个数
  • C# Var 与 Target 类型的 new

    C 9 was 正式宣布 https devblogs microsoft com dotnet welcome to c 9 0 几天前 一项新的语言功能是 目标类型的新表达式 它的用法与var 比较以下声明 我很好奇哪个性能更高 如果有
  • Rails 复制了资源中的参数

    我正在使用 Angular 资源 但我不明白为什么 Rails 会重复参数并将其放在资源名称中 我只需要了解为什么会发生这种情况 post data title asdsad rails parameters Parameters titl
  • 如何在 nginx.conf 中引用操作系统环境变量

    在 nginx conf 中 设置变量后set name value 我可以像这样参考它 name 但是当我导出操作系统环境变量时 经过env name from env like https nginx org en docs ngx c
  • 如何查找数字的二进制表示形式中 1 的个数?

    从其他搜索中 我发现这个问题被称为 汉明权重 或 人口计数 这么多的统计数据已经给出了很多答案吗 我需要以简单的方式找到解决方案吗 复杂性并不是什么大问题 JavaScript 中是否有像 Java 的 Integer bitCount 这
  • 如何通过对 R 中的变量进行分组来为折线图着色?

    我制作了一个线图 看起来像这样 我有 50 个国家及其过去 10 年 GDP 的数据集 样本数据 Country variable value China Y2007 3 55218e 12 USA Y2007 1 45000e 13 Ja
  • Flask 中的动态导航

    我有一个在 Flask 中工作的非常简单的网站 它全部由 sqlite 数据库提供支持 每个页面都作为页表中的一行存储 其中包含路径 标题 内容等内容 该结构是分层的 其中页面可以有父级 例如 虽然 关于 可能是一个页面 但也可能有 关于
  • 如何比较嵌套数组中的父记录和子记录?

    我在层次结构中有如下所示的节点 Node 1 Node 1 1 Node 1 1 1 现在我想检查父节点和子节点之间的连接是否定义 父级和子级之间的连接定义如下 例如 Node 1 和 Node 1 1 之间 connections joi
  • 获取 Facebook 帖子的所有分享列表

    我可以使用 facebook sdk 获得评论和点赞列表 但我不能 找到一种方法来获取共享帖子的所有用户的列表 我也尝试了 fql 这是我用来获得喜欢的代码 facebook new Facebook config likes facebo
  • 验证错误模板-绑定异常

    我正在使用以下模板验证错误
  • g++ 包括 boost 库

    我用 bjam 构建了我的 boost 库 然后移动了所有 a文件到c Server libs boost 1 46 0 lib 如果我想编译我的程序 则会出现一些错误 编译命令 g Ic Server libs boost 1 46 0
  • STL:为向量编写“where”运算符

    我需要根据几个布尔谓词找到向量中的索引 ex vector
  • 将工作表复制到新工作簿并让按钮指向新工作簿中的宏?

    我有一个看起来像表单的工作表 它有一个 重置 按钮来清除值 我可以运行一个宏 将该工作表复制到新的工作簿中并将其通过电子邮件发送给某人 包含宏的模块被复制到其中 一切都几乎没问题 问题是 工作表上运行重置宏的按钮仍然指向原始文档 我怎样才能
  • 如何在 Amazon AWS Lambda 函数中发布到 MQTT 主题?

    我想要一个简单的命令 就像我在 bash 中使用的那样 将某些内容发布到 AWS Lambda 函数内的 MQTT 主题 沿着以下思路 mosquitto pub h my server com t 灯 设置 m 开 背景 我想用 Alex
  • 如何在meteor.js中更新Mongodb集合?

    我有一个集合 当用户按下按钮时我需要更新它 我只需要将一个变量更改为另一个变量 在控制台中 这行代码有效 db users update username Jack age 13 username Jack 但是当我输入这段代码时 Temp
  • XCode 中的文件夹未显示在磁盘上

    我在 XCode 中向我的项目添加了一个文件夹 并将其命名为 Themes 它将用于存储我的 iPad 应用程序的主题 在它下面我有红色 蓝色等等 它们出现在 XCode 中 但是当我查看物理文件夹时 没有 Themes 目录 显然其下没有
  • 单选按钮在我的回收器视图中无法正常工作。视图中选择了多个单选按钮,这些按钮在焦点按钮中不可见

    我正在使用回收器视图在网格布局管理器中显示来自厨房或设备外部存储的所有图像 我使用单选按钮来显示图像是否被选择 PROBLEM 每当我从回收器视图中的可见视图中选择或取消选择单选按钮时 可见屏幕之外的一些其他视图就会被选择或取消选择 就像我
  • 使用托管标识连接到 Azure 应用程序配置时出现 403

    我正在尝试使用托管标识从网络框架应用程序连接到 Azure 应用程序配置 但遇到权限问题 我如何连接 options Connect new Uri https myconfigstore azconfig io new ManagedId
  • 在 Android 中出现可选文本菜单后,处理文本视图外部的触摸

    我已经通过在android中实现了可选择的文本 android textIsSelectable true 我现在需要做的是 当触摸文本 菜单 光标以外的任何地方时 使菜单消失 我该如何实现这一目标 首先 您可以点击此链接隐藏软件键盘 在单
  • 通过 ID 获取 ViewChildren 模板

    在我的组件中 我使用 ViewChildren 获取其标记模板的列表 ViewChildren TemplateRef private templates QueryList