- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在做什么
我有一个基于简单 bool 值使用 *ngIf
隐藏/显示的组件。当组件可见时,我想将焦点应用到其模板中的子元素。
问题
如果我翻转组件正确显示的 bool 值,但如果我随后尝试使用 this._elRef.nativeElement.querySelector("div#test")
获取对子元素的引用,它就会返回 空
。如果我等待几秒钟,相同的代码将按我的预期返回对该元素的引用。
推测
我假设在翻转 Boolean angular 之后经过整个渲染周期以显示新可见的组件,并且当我在下一行应用 querySelector()
时这还没有完成。
我想知道的
所以我想知道的是,我如何确定我的 ngIf
已经生效并且元素在 DOM 中被选中?
是否有回调这样的东西对于 ngIf
还是我可以强制 View 更新并从中获取回调?
我希望这是有道理的。这是漫长的一天(漫长的一周),我 super 累。
谢谢大家
如果有帮助,我正在使用 Angular2 v2.0.0-beta.15
最佳答案
如果您将 bool 值翻转为 true
并且在下一行代码中您尝试获取对由 NgIf 控制的组件或 DOM 元素的引用...好吧,那个组件或 DOM 元素还不存在。 Angular 不会与您的代码并行运行。您的 JavaScript 回调必须完成,然后 Angular(更改检测)运行,它会注意到 bool 值更改并创建组件或 DOM 元素并将其插入到 DOM 中。
要解决您的问题,请在翻转 bool 值后调用 setTimeout(callbackFn, 0)
。这会将您的 callbackFn
添加到 JavaScript message queue .这将确保 Angular(更改检测)在您的回调函数之前运行。因此,当您的 callbackFn
执行时,您要关注的元素现在应该存在。使用 setTimeout(..., 0)
可确保您的 callbackFn
在 JavaScript event loop 的下一回合中被调用.
LifeCycle hooks 开发指南在讨论 AfterView* hooks 时使用了使用 setTimeout(..., 0)
的技术。 .
如果您需要更多详细信息,这里还有一些其他示例:
focus
关于angular - 如何查看ngIf是否生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37355768/
我希望在通过 POST 方法发送数据后文本框消失。但我无法让 Javascript 工作。页面不断重新加载,因此文本框始终存在。 function puff() { if (document.get
我无法让 expand_aliases 在 bash 中生效。我尝试了很多不同的方法,但没有任何效果。 这是一个简单的测试用例: /bin/bash -c 'shopt -s expand_alias
我正在尝试查找 #include 位于 extern C block 内的所有位置。是否可以使用预处理器进行检查?我想在我的头文件中添加类似这样的内容: #ifdef EXTERN_C_IS_IN_E
我们扩展了 UILabel,以便能够为我们应用程序中给定标签类型的所有用途应用标准字体和颜色。例如。 @interface UILabelHeadingBold : UILabel @end 在我们的
案例1 我们正在尝试将自定义样式应用于渲染的 vuetify 元素: .input-group__input { background: red; } 但是没有任何变化。 案
我正在使用 symfony 1.4 和 sfGuardDoctrinePlugin,我已经安装并设置好了,但我遇到以下问题: 如果我以管理员身份登录并更新用户的权限,该用户必须注销然后重新登录才能获得
getElementsByTagName() 有 2 个很棒的特性:速度快且实时。但是,如果我想获得 p strong 怎么办。当然,我可以再次使用 getElementsByTagName() 优化
我有三个文件: spark_mock_dependency.py 提供了一个user() 方法来读取/etc/user, spark_mock.py 用于创建一个 Env 类,它使用 user() 方
我从 samples/bpf/pare_simple.c(来自 Linux 内核树)编译了 BPF 示例,做了非常简单的更改: SEC("simple") int handle_ingress(str
我有一个基本的树结构。容器可以水平滚动。我在所有 上都有正确的填充元素。但是,正确的填充没有生效。我该如何修复它才能生效? ul { height: 100%; margin: 0; p
我目前在使用 Ruby on Rails 上的 Assets 管道时遇到了一些问题。 我正在使用电子商务解决方案 (Spree),在文档中,文档中有这个: [...] you can improve
在我们非常庞大且非常复杂的 AngularJS 应用程序中,我注意到(偶然!)我的主模块设置中有这样一行... application.run(function($rootScope) { w
我发现重写getResources()后app第一次运行的activity也会对后面运行的activity生效,前提是你的手机字体特别大。 例如:执行以下步骤 将手机字体设置为巨无霸 创建两个名为 A
我正在尝试使用 KVO 来观察在我的页面 View Controller 的子内容 View Controller 的 ScrollView 中使用拖动时的更新变化,但是当应用程序启动时,它崩溃了说:
我是一名优秀的程序员,十分优秀!