如何从ngbAccordionBody嵌套模板中通过@ViewChild获取TemplateRef?
NgBootstrap Accordion中@ViewChild获取嵌入式视图内TemplateRef的可行性分析
结论:无法直接通过@ViewChild实现
Angular的@ViewChild/@ViewChildren仅能查询当前组件模板静态声明或自身直接创建的视图内的元素、指令或模板引用。而ngbAccordionBody创建的嵌入式视图是由NgBootstrap组件内部通过ViewContainerRef.createEmbeddedView生成的动态视图,该视图的归属权属于ngbAccordionBody指令,而非你的业务组件,因此你的组件无法通过@ViewChild穿透到这个动态视图内部获取目标TemplateRef。
临时方案的本质
你找到的临时方案大概率是通过访问ngbAccordion实例的内部属性,或是在视图变更后手动遍历节点获取引用。这类方案属于绕过Angular标准视图查询机制的“hack手段”,依赖NgBootstrap的内部实现细节,后续组件版本迭代可能导致方案失效。
更稳妥的替代方案
如果需要操作嵌入式视图内的内容,建议采用以下合规方式:
- 利用
ngbAccordion提供的panelChange等事件,结合模板变量传递所需引用 - 在目标
ng-template内自定义指令,通过依赖注入或@Host()装饰器获取关联的TemplateRef,再通过服务或事件将其传递到父组件
内容的提问来源于stack exchange,提问作者Jean Lou
相关产品推荐
相关产品推荐

