首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按Id获取ViewChildren模板

按Id获取ViewChildren模板
EN

Stack Overflow用户
提问于 2020-02-12 15:14:23
回答 1查看 2.9K关注 0票数 4

在我的组件中,我使用ViewChildren获得了它的标记模板的列表:

代码语言:javascript
复制
@ViewChildren(TemplateRef) private _templates: QueryList<TemplateRef<unknown>>;

在Angular8中,我无法通过Id对它们进行筛选,因此我需要查找内部属性--这在某种程度上有点麻烦:

代码语言:javascript
复制
let template = this._templates.find(t => (<any>t)._def.references[id]) : null;

现在,角度9,这不再起作用了。我检查了这个对象,发现了一个新的“黑客”:

代码语言:javascript
复制
this._templates.find(t => (<any>t)._declarationTContainer?.localNames?.includes(id)) : null;

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

仍然希望有一个没有定制指令的解决方案,例如。MatTab可能也会做类似的事情:

代码语言:javascript
复制
<mat-tab>
    <ng-template mat-tab-label>
        ...
    </ng-template>

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-12 16:31:56

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

代码语言:javascript
复制
import { Directive, Input, TemplateRef } from '@angular/core';

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

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

然后创建如下模板:

代码语言:javascript
复制
<ng-template name="t1"></ng-template>
<ng-template name="t2"></ng-template>

然后查询NgTemplateNameDirective而不是TemplateRef

代码语言:javascript
复制
@ViewChildren(NgTemplateNameDirective) private _templates: QueryList<NgTemplateNameDirective>;

并最终按名称搜索模板。

代码语言:javascript
复制
getTemplateRefByName(name: string): TemplateRef<any> {
  const dir = this._templates.find(dir => dir.name === name);
  return dir ? dir.template : null
}

在两个视图引擎( ViewEngine和Ivy )中都工作得很好。

Ng-运行示例

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60191471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档