ViewChild 返回“未定义”-Angular2

2024-01-01

我试图通过按父组件上的按钮来执行子组件的功能,但由于某种原因它未定义。

Parent:

.. com1.html
  <ng-template #content let-c="close" let-d="dismiss">
    <div class="modal-header">
      <h4 class="modal-title">Title</h4>
    </div>
    <div class="modal-body" style="display: flex; justify-content: center;">
      <app-com2 [var1]="value" #traceRef></app-com2>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-outline-dark" (click)="savePNG()"><i class="fa fa-download"></i>PNG</button>
      <button type="button" class="btn btn-outline-dark" (click)="c()">Close</button>
    </div>
  </ng-template>

<button class="btn btn-sm btn-secondary" (click)="open(content)">Button</button>

...com1.ts
export class com1 implements OnInit {
@ViewChild('traceRef') traceRef;
value = "something";

  constructor(private modalService: NgbModal) {}

  savePNG() {
    this.traceRef.savePNG();
  }

  open(content: any) {
    this.modalService.open(content, { windowClass: 'temp-modal' });
  }
}

谁能指出我正确的方向,因为其他线程没有帮助:( 即使使用 ngAfterViewInit 它仍然是未定义的。


它不能像常见情况下那样工作的原因ng-template就是它NgbModal服务创建模板,但不会将其附加到父视图,而是附加到根视图ApplicationRef

const viewRef = content.createEmbeddedView(context);
this._applicationRef.attachView(viewRef);

https://github.com/ng-bootstrap/ng-bootstrap/blob/0f8055f54dad84e235810ff7bfc846911c168b7a/src/modal/modal-stack.ts#L107-L109 https://github.com/ng-bootstrap/ng-bootstrap/blob/0f8055f54dad84e235810ff7bfc846911c168b7a/src/modal/modal-stack.ts#L107-L109

这意味着您的查询对于您的组件来说始终是不脏的。

常见情况下(参见example https://stackblitz.com/edit/angular-22u1jl由@ConnorsFan 提供)我们使用vcRef.createEmbeddedView它负责检查父视图中的查询:

vcRef.createEmbeddedView
          ||
          \/
function attachEmbeddedView(
   ...
  Services.dirtyParentQueries(view);  <========== set dirty for queries

https://github.com/angular/angular/blob/0ebdb3d12f8cab7f9a24a414885ae3c646201e90/packages/core/src/view/view_attach.ts#L12-L23 https://github.com/angular/angular/blob/0ebdb3d12f8cab7f9a24a414885ae3c646201e90/packages/core/src/view/view_attach.ts#L12-L23

我在这里看到的简单解决方案就是直接在模板中传递或调用引用:

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

ViewChild 返回“未定义”-Angular2 的相关文章

随机推荐

  • MongoDB 聚合框架 - 如何按日期范围、按天分组以及每天返回平均值进行匹配?

    我刚刚学习 MongoDB 的聚合框架 我想知道是否有人可以帮助我改进这个查询以执行以下操作 查找 匹配日期在提交范围内的记录 按天对结果进行分组 每天的回报平均值 这是我的模型 有一些有用的属性可以使编写此查询变得更容易 例如day财产
  • 对浮点数进行四舍五入,使它们的总和恰好为 1

    我有一段相当粗糙的代码 它必须或多或少随机生成一堆百分比 并存储为十进制浮点数 也就是说 它确定材料一占总数的 13 307 然后将其存储在字典中为 0 13307 问题是 我永远无法让这些数字加起来恰好为一 老实说 我并不完全确定问题是什
  • Javascript:location.hostname 和 document.domain 之间的区别?

    使用 location hostname 和 document domain 有什么区别 我认为用例子来解释会很有帮助 看起来document domain is a 只读属性 但在 Mozilla 中除外 它允许您更改用于 例如 AJAX
  • 从 WINAPI 获取文件的先前版本

    在 Windows 7 中 可以获取以前版本的文件 如下图所示 有没有办法通过代码检索文件的先前版本 因为我找不到任何API 感谢先进 这个问题列出了几个标签 因此 尚不清楚是否需要严格的 c c 方法 或者脚本等是否有效 任何状况之下 以
  • Ansi-C 中的单行注释

    我已经习惯了 标记来自 Java 和 Visual Studio 的单行注释 令人惊讶的是 Ansi C 不存在这种注释 使用 my comment 很烦人 使用 Ansi C 时还有其他方法标记单行注释吗 ANSI C 不可以 但当前的标
  • 我们如何使用 APK 主扩展文件中的图像?

    我最近 2 天面临一个问题 我们如何在 Google Play 上上传大小超过 50Mb 的 apk 文件 然后我找到了一种从链接上传带有 APK 扩展文件的 apk 文件的方法http developer android com guid
  • 轻量级 Java 对象缓存 API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ASP.NET - 获取 DirectoryEntry / SID 的主体 / 相对标识符 (RID)

    我在自定义 MembershipProvider 类中使用 Active Directory 对 ASP NET 2 0 Intranet 应用程序中的用户进行身份验证 并将其 sid 与该应用程序的配置文件相关联 当 的时候ActiveD
  • ColdFusion 和移动应用程序结构和安全性

    Overview 我希望开始使用 HTML5 jQuery 和 ColdFusion 开发 iOS 应用程序 我对此的理解是让 jQuery 为所有后端函数调用 ColdFusion API 伟大的 我的问题主要是关于页面结构和 API 安
  • 如何设置cassandra读写一致性

    我找不到这方面的文档 我知道cqlsh中有一致性命令 但是读一致性和写一致性没有区别 如何为读取和写入设置不同的一致性级别 此外 还提到了 默认 一致性级别 默认设置在哪里 它是用于读还是写 如何为读取和写入设置不同的一致性级别 如果您只想
  • struts2 + hibernate3 + jasper-report 5.0 ----- 得到空白报告

    我创建了一个应用程序 它使用 jasper report 5 0 struts2 和 hibernate 打印报告 jasper报告使用hql 该应用程序工作正常 但问题是我得到空白报告在浏览器中 当我触发 struts 操作时 但是当我在
  • VSCode 语法突出显示不适用于 Vue / Vetur

    在过去一周左右的时间里 我使用的每个 VUE 文件都没有语法突出显示 我通常有扩展名Vetur帮助对 VUE 文件进行语法突出显示和其他调整 到目前为止我尝试过的事情 卸载 重新安装 Vetur 更改 VScode 中的文件关联 确保 vu
  • Moose 结构类型

    我想在 Moose 中创建一个结构化类型 可以用作另一个 Moose 属性的类型 例如 我希望能够创建一个name有自己的属性value and error属性 因此 我想知道实现这一目标的最佳方法 我通过定义一个简单的 Moose 类来表
  • 将给定的十进制数转换为二进制数并计算连续的 1 并显示

    问题 将给定的十进制数转换为二进制数并统计连续的1并显示 示例案例1 5的二进制表示为101 因此连续1的最大数量为1 示例案例2 13 的二进制表示为 1101 因此连续 1 的最大数量为 2 解决方案 bin python3 impor
  • 为什么将 1 添加到 byte.MaxValue 会导致 256 而不是溢出[重复]

    这个问题在这里已经有答案了 我在 C 中有一段简单的代码 用于在向类型的 MaxValue 添加 1 时显示溢出错误 using System using System Collections Generic using System Li
  • dart 控制台应用程序中的 Ctrl+c

    Is there a way to catch CTRL C in dart console application For example press CTRL C to send clean closing packet to web
  • Ansible 循环遍历模板中的字母范围

    我正在尝试生成一个 Ansible 模板 该模板按字母顺序而不是数字顺序递增 有没有类似的功能range x 那可以帮助我吗 伪代码示例 for letter in range a d letter endfor 预期产出 a b c d
  • Prolog if 语句

    我正在尝试实现一个按如下方式工作的谓词 pred do this always if statement do this only when if statement is true do this also always independ
  • 设计数据仓库时使用临时数据库的好处

    我正在设计数据仓库架构 在探索从生产中提取数据并将其放入数据仓库的各种选项时 我遇到了许多文章 主要建议以下两种方法 生产数据库 gt 数据仓库 星型模式 gt OLAP立方体 生产数据库 gt 暂存数据库 gt 数据仓库 星型模式 gt
  • ViewChild 返回“未定义”-Angular2

    我试图通过按父组件上的按钮来执行子组件的功能 但由于某种原因它未定义 Parent com1 html