如何检查ngIf是否生效

2024-04-03

我在做什么
我有一个隐藏/显示的组件*ngIf基于简单的布尔值。当组件变得可见时,我想将焦点应用于其模板中的子元素。

问题
如果我翻转布尔值,组件会正确显示,但如果我尝试使用以下命令获取对子元素的引用this._elRef.nativeElement.querySelector("div#test")它刚刚回来null。如果我等待几秒钟,相同的代码将按照我的预期返回对元素的引用。

投机
我假设翻转布尔角度后会经历整个渲染周期以显示新可见的组件,并且当我应用querySelector()在下一行。

我想知道什么
所以我想知道的是,我怎样才能确定我的ngIf已经生效并且元素是在 DOM 中被选择的吗?
有没有回调之类的东西ngIf或者我可以强制视图更新并从中获取回调吗?

我希望这是有道理的。这是漫长的一天(漫长的一周),我非常累。
谢谢大家

如果有帮助,我正在使用 Angular2 v2.0.0-beta.15


如果将布尔值翻转为true在下一行代码中,您尝试获取对由 NgIf 控制的组件或 DOM 元素的引用...好吧,该组件或 DOM 元素还不存在。 Angular 不与您的代码并行运行。您的 JavaScript 回调必须完成,然后 Angular(更改检测)运行,它将注意到布尔值更改并创建组件或 DOM 元素并将其插入到 DOM 中。

要解决您的问题,请致电setTimeout(callbackFn, 0)翻转布尔值后。这会添加您的callbackFn to the JavaScript 消息队列 https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop#Queue。这将确保 Angular(更改检测)在回调函数之前运行。因此,当你的callbackFn执行后,您想要聚焦的元素现在应该存在。使用setTimeout(..., 0)确保您的callbackFn在下一个回合中被叫JavaScript 事件循环 https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop#Event_loop.

这种技术使用setTimeout(..., 0)在 LifeCycle hooks 开发指南中讨论时使用AfterView* 挂钩 https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#afterview.

如果您需要更多详细信息,这里还有一些其他示例:

  • https://stackoverflow.com/a/35752722/215945 https://stackoverflow.com/a/35752722/215945- 使用焦点()
  • https://stackoverflow.com/a/34757864/215945 https://stackoverflow.com/a/34757864/215945- 使用Renderer来调用focus
  • https://stackoverflow.com/a/36338181/215945 https://stackoverflow.com/a/36338181/215945- 使用指令来设置焦点
  • https://stackoverflow.com/a/34503163/215945 https://stackoverflow.com/a/34503163/215945- 展示了 4 种不同的方法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查ngIf是否生效 的相关文章

随机推荐

  • Java读取文件,如果不存在则创建它

    这是我的代码 public String path public String fileName public static void readData throws IOException try path myPath fileName
  • 具有固定大小的 Blackberry VerticalFieldManager:滚动问题

    我试图拥有一个带有修复标题 带有某些字段的管理器 和可滚动内容 自定义字段列表 的全屏用户界面 这个想法是模拟一种可滚动列表 为此 我制作了一个接受 maxHeight 屏幕高度 标题高度 的自定义 VerticalFieldManager
  • NSPopover 内的 NSTableview 看起来与独立的不同

    我创建了一个ListView类 这是一个非常简单的Tableview 如果我用 IB 实例化它 一切看起来都很好 如果我以编程方式实例化它也是一样 如果我在一个内部以编程方式实例化它NSPopover 我的桌子的每一行都有浅灰色背景 这是从
  • 为什么 form.submit() 不起作用?

    我在页面中有以下片段 我一生都无法弄清楚为什么单击button1元素时表单没有提交 我在 IE 中收到错误消息 指出该对象不支持此属性或方法 我将 document poform 放入警报中 它会警报表单对象 我感觉我可能错过了一些非常明显
  • 某些设备上的 Android 中出现“没有这样的表”问题

    我在 Android 应用程序中使用外部数据库 它在所有模拟器和三星真实设备上运行良好 但是当我检查宏碁智能手机时 我的应用程序崩溃并出现以下异常 android database sqlite SQLiteException no suc
  • 可变结构与类?

    我不确定是否使用可变结构或可变类 我的程序存储一个包含很多对象的数组 我注意到使用类会使所需的内存量增加一倍 但是 我希望对象是可变的 并且有人告诉我使用可变结构是邪恶的 这就是我的类型 struct or class Block publ
  • 将 Flash (AS3) 数据保存为 XML

    我在互联网上 包括 Stack Overflow 花了好几个小时 试图找到一个可靠的 可行的示例 将 Flash 中的信息保存到 XML 文件中 我想获取两种不同类型对象的位置并将每个对象的列表导出到 XML 我们将调用这些对象ball a
  • PHP 5.3.3 中的 ini_set("memory_limit") 根本不起作用

    我之前有过这样的工作 echo ini get memory limit n ini set memory limit 256M echo ini get memory limit n 这将输入 32M 256M 在通过命令行执行的 php
  • 如何在 C# HttpClient 中循环调用分页 URL 以从 JSON 结果下载所有页面

    我的第一个问题 所以请友善 我正在使用C HttpClient调用作业 API 端点 这是端点 Jobs API Endpoint 不需要密钥 点击即可 http service dice com api rest jobsearch v1
  • 如何延迟连接流?

    我正在尝试实现一个在其实现中使用其自身的另一个实例的流 该流前面有一些常量元素 使用 IntStream concat 因此只要串联流惰性地创建非常量部分 这应该就可以工作 我认为使用StreamSupport intStream 重载采用
  • 使用 ThreadPool Python 时的最大池大小

    我正在使用 ThreadPool 来实现多处理 使用多处理时 池大小限制应等于 CPU 核心数 我的问题 使用 ThreadPool 时 池大小限制应该是 CPU 核心数吗 这是我的代码 from multiprocessing pool
  • 外键为空 - 性能下降

    我有一个表文件夹 其中列parent id 引用id 如果该文件夹有父级 如果没有 则parent id 为空 这是好的解决方案还是我需要额外的表来进行此连接或其他解决方案 外键是否可以为空 如果可以 这个解决方案将有更长的执行时间 tab
  • 无法访问 Axios 拦截器内的 Vuex 存储突变

    EDIT 这个问题非常混乱 所以我基本上用相同的代码示例和相同的场景重写它 当服务器发送 401 错误响应时 我试图 commit从拦截器到我的 vuex 存储 import axios from axios import store fr
  • 用于查看特定端口的命令行

    有没有办法从 Windows 命令行检查特定端口的状态 我知道我可以使用 netstat 检查所有端口 但 netstat 很慢 并且查看特定端口可能不会 这里是简单的解决方案端口查找 In cmd netstat na find 8080
  • 在 Visual Studio 2015 中哪里可以找到 Microsoft.TeamFoundation.Build.Client?

    我有一个干净的 Windows 安装 仅安装了 Visual Studio 2015 并且我正在寻找 Microsoft TeamFoundation Build Client 程序集 我想知道它现在是否已随着即将推出的 vNext Bui
  • 如何将Python数据类转换为字符串文字字典?

    给定一个如下所示的数据类 class MessageHeader BaseModel message id uuid UUID def dict self kwargs return json loads self json 我想在调用时获
  • 每个进程的最大线程数 - sysconf(_SC_THREAD_THREADS_MAX) 失败

    我试图找到 UNIX 机器上每个进程的最大线程数 并编写下面的代码来使用 sysconf include
  • 如何追踪“libc++abi.dylib:调用了纯虚函数!”在Xcode中

    我有一个混合使用 C Objective C 和 Swift 的多线程 OS X 应用程序 当我的应用程序关闭时 我在 Xcode 调试器窗口中看到以下内容 libc abi dylib Pure virtual function call
  • python/pandas/一维数据框

    创建二维数据框效果很好 y np array 1 2 3 4 df pd DataFrame y index 1 2 columns a b print df 但是如果我尝试创建一维数据框 我会收到一条错误消息 z np array 5 6
  • 如何检查ngIf是否生效

    我在做什么我有一个隐藏 显示的组件 ngIf基于简单的布尔值 当组件变得可见时 我想将焦点应用于其模板中的子元素 问题如果我翻转布尔值 组件会正确显示 但如果我尝试使用以下命令获取对子元素的引用this elRef nativeElemen