首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Angular ViewChild valueChange处理程序在组件被隐藏并被*ngIf刷新后停止触发

Angular中的ViewChild是一个装饰器,用于在组件中获取对子组件、指令或DOM元素的引用。valueChange是ViewChild的一个属性,用于监听被引用元素的值变化事件。当组件被隐藏并通过ngIf指令刷新后,valueChange处理程序停止触发的原因是,ngIf指令会重新创建组件的DOM元素,而重新创建的元素与之前的元素不是同一个实例,因此之前绑定的事件处理程序会失效。

为了解决这个问题,可以使用ChangeDetectorRef服务来手动触发变化检测。ChangeDetectorRef是Angular中的一个服务,用于检测组件及其子组件的变化,并更新视图。

以下是处理该问题的步骤:

  1. 在组件中导入ChangeDetectorRef服务:
代码语言:txt
复制
import { Component, ViewChild, ChangeDetectorRef } from '@angular/core';
  1. 在组件中注入ChangeDetectorRef服务:
代码语言:txt
复制
constructor(private cdr: ChangeDetectorRef) { }
  1. 在valueChange处理程序中手动触发变化检测:
代码语言:txt
复制
@ViewChild('elementRef') elementRef: ElementRef;

ngAfterViewInit() {
  this.elementRef.nativeElement.valueChange.subscribe(() => {
    // 处理值变化事件
    this.cdr.detectChanges(); // 手动触发变化检测
  });
}

在上述代码中,假设ViewChild引用的是一个名为elementRef的元素。在ngAfterViewInit生命周期钩子函数中,订阅elementRef.nativeElement的valueChange事件,并在事件处理程序中调用this.cdr.detectChanges()手动触发变化检测。

这样,在组件被隐藏并通过*ngIf指令刷新后,valueChange处理程序仍然会被正确触发。

推荐的腾讯云相关产品:腾讯云云服务器(CVM)、腾讯云云数据库MySQL、腾讯云云原生容器服务(TKE)。

腾讯云云服务器(CVM)产品介绍链接:https://cloud.tencent.com/product/cvm

腾讯云云数据库MySQL产品介绍链接:https://cloud.tencent.com/product/cdb_mysql

腾讯云云原生容器服务(TKE)产品介绍链接:https://cloud.tencent.com/product/tke

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

AngularDart 4.0 高级-生命周期钩子 顶

ngOnInit之前调用并且每当有一个或多个数据绑定输入属性发生变化时调用。 ngOnInit Angular首次显示数据绑定属性设置指令/组件的输入属性,初始化指令/组件。...取消订阅observables分离事件处理程序以避免内存泄漏。 Angular摧毁指令/组件之前调用。 其他生命周期挂钩 其他Angular子系统除了这些组件钩子可能有自己的生命周期钩子。...OnInit 使用ngOnInit有两个主要原因: 施工不久执行复杂的初始化 Angular设置输入属性后设置组件 有经验的开发人员同意组件应该便于构建且安全。...大部分初始检查都是由Angular页面其他地方首次渲染(与数据无关)而触发的。 仅仅通过鼠标移动到另一个输入框就会触发一个呼叫。 相对较少的调用显示相关数据的实际变化。...Angular的单向数据流规则禁止视图组成之后更新视图。 组件视图组合完成,这两个钩子都会触发。 如果钩子立即更新组件的数据绑定comment属性,Angular会抛出一个错误(尝试它!)。

6.2K10

(转) 别再对 Angular 表单的 ControlValueAccessor 感到迷惑

组件封装器 由于 Angular 为所有默认原生控件提供了控件值访问器,所以封装第三方插件或组件时,需要写一个新的控件值访问器。...{ @ViewChild('location') location; @Input() value; @Output() private valueChange = new EventEmitter...事件获取变化的值,一旦 slidestop 事件触发了,就可以使用输出事件发射器 valueChanges 通知父组件。...但是,我们想要的是,使用 slider 组件作为表单的一部分,使用模板驱动表单或响应式表单的指令与其数据通信,那就需要让其实现 ControlValueAccessor 接口了。...registerOnChange 里我们简单保存了对回调函数 fn 的引用,回调函数是由 formControl 指令传入的(译者注:参考 L85),只要每次 slider 组件值发生改变,就会触发这个回调函数

3.8K20
  • Angular教程】-内容投影u002F@ContentChildu002F@ViewChild

    使用 ng-template 元素,你可以让组件根据你想要的任何条件显式渲染内容,并可以进行多次渲染。显式渲染 ng-template 元素之前,Angular 不会初始化该元素的内容。...: ContentDirective; } 通过日志可以看到我们切换容器组件的expanded标识时,只有开启状态my-hello组件才会初始化,下面的这个ngIf虽然页面看不到渲染的内容,但组件实实在在被初始化过了...@ContentChild & @ContentChildren 使用这两个装饰器来对投影的组件进行操作 使用注解在业务组件中定义投影的组件 @ContentChild(HelloWorldComp...()钩子执行投影组件进行操作 6....@ViewChild & @ViewChildren 使用这两个装饰器来对指接子组件进行操作 使用注解在业务组件中定义子组件 @ViewChild(HelloWorldComp) helloComp

    54830

    【Appetite】ionic3实录(七)次页实现及分析解决问题【下】

    this.cd.detectChanges()强制检测刷新dom。...问题二:为什么用[hidden],不用*ngIf或者ngSwitch? 因为前者只是隐藏,而后两者是会移除。...同理,有些组件要注意类似情况。这并不是说都不要用*ngIf,因为当页面元素太多时会容易导致界面卡顿,所以没用的多余元素应该移除,此时就用它。一句话说就是根据情况合理选择显示控制方法。...ts中把initSwiper方法相关内容移除: import { Component, ViewChild, ElementRef, ChangeDetectorRef } from '@angular...是因为该组件异步获取到数据this.vm.dessertSlides前已完成了初始化了,这样新数据其实没有应用到,为了处理这种情况,我们改造一下html,为ion-slides组件加上一段*ngIf=

    1.4K20

    Angular 从入坑到挖坑 - 组件食用指南

    selector:选择器,当我们页面上添加了这个选择器指定的标签(),就会在当前使用位置上创建插入这个组件的一个实例 templateUrl...="expr">NgIf 结构型指令 当 expr 属性为 true 时,这个元素则会显示页面上,当属性值为 false 时,则不显示该元素 ngIf 指令并不是通过使用 css 样式来隐藏元素的...,可以使用管道对于表达式的结果进行转换 管道是一种简单的函数,它们接受输入值返回转换的值。...五、组件的生命周期钩子函数 当 angular 创建、更新、销毁组件时都会触发组件的生命周期钩子函数,通过组件中实现这些生命周期函数,从而介入到这些关键时刻 钩子函数 触发时机 ngOnChanges...ngAfterContentInit 组件内容渲染完成调用一次 ngAfterContentChecked 只要组件的内容发生改变就会被调用 ngAfterViewInit 视图加载完成触发一次,

    15.8K30

    Angular核心-父子间组件传递数据-重难点

    ]="userName"> child2.ts子组件定义扩展属性 //普通属性不能组件传值 //child2Name:string = ''...父 子组件通过触发特定事件(其中携带数据),把数据传递给父组件(父组件提供事件处理方法) Child.ts:自定义事件发射器–输出属性 import { Component, EventEmitter,...c2 > ts文件里: @ViewChild('c0',{static:true})//这个c0表示组件c1 private c0: any;//这个c0是自己起的名字,与组件...c0绑定 @ViewChild('c1',{static:true}) private c1: any; 提示:ViewChild装饰器用于将子组件识别符与某个属性关联起来,第一个参数必须是已经存在的子组件识别符...(不带#),第二个参数static指定该组件是否为“静态组件”—不会有时有时无的组件(比如ngIf,ngFor) 注意: 通过“ViewChild”-视图组件方式,父组件可以获得任意子组件中的数据,

    1.2K20

    angular面试题及答案_angular面试

    ngOninit:初始化指令或组件angular第一次显示展示组件的绑定属性调用,该方法只会调用一次 ngDocheck:检测 ngAfterContentInit:当把内容投影进组件之后调用,...angular每次销毁组件或指令之前调用,通常用于移除事件监听,退订可观察对象。...指令分类 组件:用于构建UI组件,继承于Directive类 属性指令:用于改变组件的外观或行为 ngClass ngStyle 结构指令:用于动态添加或删除DOM元素来改变DOM布局 ngIf ngFor...module声明了哪些模块可以其他模块使用,依赖注入了哪些类,以及启动的component,模块来管理组件,使app实现模块化。 21. 怎样组件中选择一个元素?...当类初始化之后,构造函数会被调用 ngOnInit ngOnInit 是angular中OnInit钩子的实现,用来初始化组件

    11.1K120

    Angular2 之 结构型指令几个概念

    注意:这里是出现或者消失,并不是隐藏隐藏元素的利弊 当我们隐藏元素时,组件的行为还在继续。 它仍然附加子啊它所属于的DOM元素上,它仍然监听事件。...angular会继续检查哪些能影响数据绑定的变更。组件原本要做的哪些事情仍然进行!它还是占用着那么多的资源。 另外一方面,重新显示这个组件会很快。...组件以前的状态保留着,随时可以显示。组件不用重新初始化,当然,该操作付出代价比较大! 移除元素组件 利 把ngIf设置为false,将会影响到组件的资源消耗。...angular会从DOM中移除该元素,停止相关组件的变更检测,把它从DOM事件中移除,并且销毁组件组件会被垃圾回收,释放内存。...Angular应用之外,标签的默认CSS属性display是none 。 它的内容存在于一个隐藏的文档片段中。

    3K20

    Angular v8 发布!来看看有什么新功能

    由于 Angular 大量的底层部分已经为此进行了更改,因此 Angular 团队特别注意与以前的 Angular 版本的兼容性:切换到 Ivy 之后,现有的程序应该能够像以前一样工作。...计算函数 nQueens 之后,事件监听器通过 postMessage 将结果发送回主线程。*因此,浏览器在那里触发 message 事件。...虽然它们早期版本中被用于组件请求不在结构指令内的元素,如 ngIf 或 ngFor,但查询结果已在 ngOnInit 中可用。...由于这种行为十分令人困惑,所以现在组件必须指定何时应该进行解决: 1@ViewChild('info', { static: false }) 2 paragraph: ElementRef; 如果...使用 static:false 时,启动或刷新视图后进行解析。 ng update 命令 会自动尝试在此处输入正确的值。如果无法做到这一点,则会在其位置添加带有 TODO 的注释。

    3K30

    AngularDart4.0 指南- 模板语法二 顶

    如果名称未能匹配已知指令的元素事件或输出属性,则Angular会报告“未知指令”错误。 $event和事件处理语句 事件绑定中,Angular为目标事件设置了一个事件处理程序。...例如,TypeScript Angular程序通常具有诸如* ngIf =“currentHero”的代码,其中Dart程序具有诸如* ngIf =“currentHero!...当NgIf为false时,Angular从DOM中删除元素及其后代。 它摧毁了他们的组件,潜在地释放了大量的资源,从而带来了更加快速的用户体验。 展示/隐藏技术适合少数几个后代的元素。...警惕隐藏大型组件树; NgIf可能是更安全的选择。 警惕null ngIf指令通常用于防止null。 显示/隐藏是无用的。 如果嵌套表达式试图访问null属性,Angular会抛出一个错误。...对于这些小型转换来说,Angular 管道是一个很好的选择。 管道是简单的函数,它接受一个输入值返回一个转换的值。

    30K20

    Angular8稳定版修改概述

    您可以参考Bazel文档,了解如何将其与Angular一起使用。 你可能想知道:“Bazel准备好了吗?”简答:还没有。目前,它处于“选择预览”模式。...增量构建:您将能够仅构建和部署已更改的内容而不是整个应用程序。 您可以弹出Bazel文件,默认情况下它们是隐藏的。...的支持 Angular团队希望为使用AngularJS的所有开发人员提供支持,帮助他们升级到Angular。...如果要触发一个表单组中所有控件的验证,这个方法将是非常有用的。...它们将在变更检测运行解析。 需要注意的是,设置static: true将不允许您从动态模板分辨率(例如*ngIf)获得结果。 添加了原理图支持以将现有代码迁移到此语法,因为将使用此语法Ivy 。

    4.5K20

    ng-content 中隐藏的内容

    如果你尝试 Angular 中编写可重复使用的组件,则可能会接触到内容投射的概念。然后你发现了 ,找到了一些关于它的文章,进而实现了所需的功能。...,组件类中的 id 属性用于显示本组件实例化的次数。...ngProjectAs 有时你的内部组件会被隐藏在另一个更大的组件中。有时你只需要将其包装在额外的容器中即可应用 ngIf 或 ngSwitch。...我们尝试解释为什么之前,让我们再来验证一个问题,即在 ng-content 指令的外层容器中添加 ngIf 指令: import { Component } from '@angular/core';...其中唯一方法就是查看第三方库的代码,了解它们的内部处理逻辑。将组件的生命周期被绑定到我们的应用程序组件而不是包装器的意义是,开发者可以掌控计数器只实例化一次,而不用了解第三方库的内部代码。

    2.7K30

    AngularDart4.0 英雄之旅-教程-04明细 顶

    在此页面中,您将扩展“Tour of Heroes”应用程序,以显示英雄列表,允许用户选择英雄显示英雄的详细信息。 完成此页面,该应用应该看起来像这个实例(查看源代码)。...指令隐藏空的对象 当应用程序加载时,selectedHero为null。...刷新浏览器,该应用程序不再失败,名称列表再次显示浏览器中。 当没有选定的英雄时,ngIf指令从DOM中移除英雄详情HTML。 没有英雄细节元素或绑定担心。...您了解了如何在组件模板中使用核心指令ngIf和ngFor。 您在CSS文件中定义了样式,使用它们来设置应用程序的样式。 你的应用应该看起来像这个实例(查看源代码)。...前方的路 你已经扩大了英雄之旅的应用程序,但它还远远没有完成。 一个应用程序不应该是一个单一的组件。 在下一页中,您将将应用程序拆分为子组件使它们一起工作。

    3K30

    AngularDart4.0 指南- 显示数据 顶

    现在运行应用程序。 它应该显示标题和英雄的名字: ? 模板内嵌或模板文件? 您可以将组件的模板存储两个地方之一中。...用NgIf进行条件显示 有时候,只有特定情况下,应用程序才需要显示视图或视图的一部分。 如果有三个以上的英雄,让我们更改示例以显示一条消息。...双引号内的模板表达式,* ngIf =“heros.length> 3”,看上去和表现很像Dart。 当组件的英雄列表中有三个以上的项目时,Angular会将该段落添加到DOM,显示消息。...回到app_component.dart删除或注释掉英雄列表中的一个元素。 浏览器应该自动刷新,消息应该消失。 概要 现在你知道如何使用: 用双花括号插入来显示组件属性。 ngFor显示项目列表。...Dart类,用于为您的组件生成模型数据显示该模型的属性。 ngIf有条件地显示基于布尔表达式的HTML块。

    5.3K10

    AngularDart 4.0 高级-结构指令 顶

    指南描述如何将指令应用于HTML模板中的元素时引用了属性(attribute)名称。 还有其他两种Angular指令,在其他地方广泛描述:(1)组件和(2)属性指令。...当条件为false时,NgIf从DOM中删除它的宿主元素,将它从DOM事件(它所依附的)中分离出来,将组件Angular变化检测中分离出来销毁它。 组件和DOM节点可以垃圾收集释放内存。...对于一个简单的段落来说,隐藏和删除之间的区别并不重要。 当宿主元素连接到资源密集型组件时,这很重要。 即使隐藏,这种组件的行为也会继续。 该组件保持连接到其DOM元素。 它一直倾听事件。...该组件的以前的状态保存准备显示。 该组件不会重新初始化 - 这种操作可能很昂贵。 所以隐藏和展示有时候是正确的。...let-i和let-odd变量定义为let i = indexlet odd = odd。 Angular将它们设置为上下文的index和odd 属性的当前值。

    16.1K20

    Angular 显示英雄列表

    本页面,你将扩展《英雄指南》应用,让它显示一个英雄列表, 允许用户选择一个英雄,查看该英雄的详细信息。 创建模拟(mock)英雄数据 你需要一些英雄数据以供显示。...主从结构 当用户主列表中点击一个英雄时,该组件应该在页面底部显示所选英雄的详情。 本节,你将监听英雄条目的点击事件,更新英雄的详情。...添加 click 事件处理器 把该组件的 hero 属性改名为 selectedHero,但不要为它赋值。 因为应用刚刚启动时并没有所选英雄。...英雄们显示列表中,并且所点英雄的详情也显示了页面的下方。 修复 - 使用 *ngIf隐藏空白的细节 该组件应该只有当 selectedHero 存在时才显示所选英雄的详情。...并且为这个 div 添加 Angular 的 *ngIf 指令,把它的值设置为 selectedHero。 不要忘了 ngIf 前面的星号(*),它是该语法中的关键部分。

    4.4K70

    Angular 显示英雄列表

    本页面,你将扩展《英雄指南》应用,让它显示一个英雄列表, 允许用户选择一个英雄,查看该英雄的详细信息。 创建模拟(mock)英雄数据 你需要一些英雄数据以供显示。...主从结构 当用户主列表中点击一个英雄时,该组件应该在页面底部显示所选英雄的详情。 本节,你将监听英雄条目的点击事件,更新英雄的详情。...添加 click 事件处理器 把该组件的 hero 属性改名为 selectedHero,但不要为它赋值。 因为应用刚刚启动时并没有所选英雄。...英雄们显示列表中,并且所点英雄的详情也显示了页面的下方。 修复 - 使用 *ngIf隐藏空白的细节 该组件应该只有当 selectedHero 存在时才显示所选英雄的详情。...并且为这个 div 添加 Angular 的 *ngIf 指令,把它的值设置为 selectedHero。 不要忘了 ngIf 前面的星号(*),它是该语法中的关键部分。

    4K30

    过渡到 Angular 17 的新控制流语法

    最近将我们当前项目的一些模板迁移到Angular 17的新控制流语法,我觉得分享一些见解能够帮助一些人顺利过渡到这种新语法,为每个控制流结构提供清晰和明确的示例。所以,让我们开始吧。...传统指令与Angular 17的控制流语法对比让我们使用一些示例来比较传统指令和Angular 17的控制流语法:*ngIf指令 vs @if控制块Before(传统 *ngIf):<div *ngIf...迁移提示从简单组件开始:逐渐转移到更复杂的组件。使用自动迁移:使用 Angular v17 CLI 的迁移命令。ng g @angular/core:control-flow或者更好的方式是分步进行。...例如,某些情况下,您可以使用 @defer 块来延迟加载内容。向后兼容性和性能Angular 17允许您在应用程序中同时使用新旧语法。...结论Angular 17引入的新控制流语法处理Angular应用程序中的模板和渲染逻辑方面带来了显著的改进。转换到这种新语法,承诺会使我们的代码更易读、易维护和高性能。

    67320
    领券