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

升级到angular 9后ViewChild无法正常工作

升级到Angular 9后,ViewChild无法正常工作的原因可能是由于Angular版本升级导致的一些变化和更新。在Angular 9中,对于ViewChild的使用有一些改动,需要进行相应的调整。

ViewChild是Angular中用于获取子组件或DOM元素的装饰器。在Angular 9之前的版本中,可以直接使用ViewChild来获取子组件或DOM元素的引用,例如:

代码语言:txt
复制
@ViewChild(ChildComponent) childComponent: ChildComponent;
@ViewChild('myElement') myElement: ElementRef;

但是在Angular 9中,由于对视图封装进行了一些改进,ViewChild的默认查询器已经更改为静态查询器。这意味着在模板初始化之前,无法通过ViewChild获取到子组件或DOM元素的引用。

为了解决这个问题,可以使用动态查询器来替代默认的静态查询器。动态查询器可以在模板初始化之后进行查询,确保ViewChild能够正常工作。例如:

代码语言:txt
复制
@ViewChild(ChildComponent, { static: false }) childComponent: ChildComponent;
@ViewChild('myElement', { static: false }) myElement: ElementRef;

在上面的代码中,通过将{ static: false }传递给ViewChild装饰器,可以使用动态查询器来获取子组件或DOM元素的引用。

另外,如果在Angular 9中使用ViewChild获取的是一个模板引用变量,需要使用{ read: TemplateRef }来指定查询的类型。例如:

代码语言:txt
复制
@ViewChild('myTemplate', { read: TemplateRef }) myTemplate: TemplateRef<any>;

关于Angular 9中ViewChild的更多详细信息,可以参考腾讯云的Angular文档:Angular ViewChild

总结起来,升级到Angular 9后,需要注意ViewChild的使用方式发生了变化,需要使用动态查询器来替代默认的静态查询器,并且对于模板引用变量,需要使用{ read: TemplateRef }来指定查询的类型。

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

相关·内容

Angular6自定义表单控件方式集成Editormd

表单控件更新的函数(即,设置当控件接收到 change 事件,调用的函数) registerOnTouched:用来获取通知用户正在交互的函数(即,设置当控件接收到 touched 事件,调用的函数...里面确实能看到一些似曾相识的方法,但个人能力有限,无法完全看懂,也就只能到这里了,喜欢深入探究的可以自行探索。...准备工作 经过上面大致了解ControlValueAccessor,在正式开始前还需要最后的准备工作: 使用npm或者yarn安装jquery npm install jquery 或者 yarn add...@ViewChild('host') host; // hmtl中添加 #host标识,用于选择组件模板内的节点 ngAfterViewInit(): void { this.init();...''; constructor() { } public onload() { } public onchange() { } } 最后记得按照正常组件进行引入和声明才可使用哦

5.2K20

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

生命周期序列 通过调用其构造函数创建组件/指令Angular在特定时刻按以下顺序调用生命周期钩子方法: 钩子 作用和时机 ngOnChanges Angular(重新)设置数据绑定输入属性时响应。...ngOnInit 在Angular首次显示数据绑定属性并设置指令/组件的输入属性,初始化指令/组件。 在第一次ngOnChanges之后调用一次。...ngDoCheck 检测Angular无法无法自行检测到的更改并采取相应措施。 在每次更改检测运行期间,立即在ngOnChanges和ngOnInit之后调用。...这是指令的完美渗透工作。 英雄们永远不会知道他们正在被监视。 一边开玩笑,注意两点: Angular为指令和组件调用钩子方法。 间谍指令可以提供对不能直接更改的DOM对象的洞察。...英雄对象引用没有改变,所以从Angular的角度来看,没有改变的反馈! DoCheck 使用DoCheck钩子来检测并处理Angular自己无法捕获的更改。

6.1K10

Angular ElementRef 简介

下面我们就来分析一下 ElementRef 类: ElementRef 的作用 在应用层直接操作 DOM,就会造成应用层与渲染层之间强耦合,导致我们的应用无法运行在不同环境,如 web worker 中...首先我们要先获取 div 元素,在文中 “ElementRef 的作用” 部分,我们已经提到可以利用 Angular 提供的强大的依赖注入特性,获取封装的 native 元素。...其实在 Angular 框架内部已经为我们提供了解决方案,它为我们提供了内置的装饰器,如 @ContentChild、 @ContentChildren、@ViewChild、@ViewChildren...具体使用示例如下: import { Component, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; @Component...最后我们来看一下,最终优化的代码: import { Component, ElementRef, ViewChild, AfterViewInit, Renderer2 } from '@angular

1.6K60

Seam Carving demo

从github上clone了源码,作者原来是用React写的,我把他改成了angular,同样实现了最基本的功能。 下面写一下改写的过程: 首先明确下我们需要实现的最基本的功能: 1.图片上传。...实现上传文件,通过imageSrc绑定的Src,值得注意的是URL.createObjectURL(files[0])可能会导致跨域问题,因此需要使用SafeUrl声明这个链接是安全的,才能正常显示图片...'> @ViewChild('imgRef', { static: false }) imgRef: ElementRef; @ViewChild('canvasRef', { static...} from '@angular/core'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import {...top: -35px; opacity: 0%; cursor: pointer; } 最后看下实现的效果对比: 微信截图_20210527224912.png 可以看出缩放的图像还是比较一致的

2.2K30

反思录:Angular实现svg和png图片下载

获取元素 Angular中提供一种叫做ViewChild的注解,可以帮助我们引用到页面中的svg元素,此处就是#template....解决@ViewChild未及时刷新问题 @ViewChild取得页面元素可能不是最新的,Angular的Change detection需要时间完成刷新,所以有很短时间的延迟[2]。...紧接着,我在toBlob方法插入了console.log(this.sanitizer),运行打印的结果是undefined。这能说明什么?程序执行到这里了?...然后,我开始思考“难道我写的Angular的注入方式不对?”,在遍寻Angular的官方文档和样例之后,我确信注入方式没有问题。...// 注意此处bind(this) .subscribe(url => { this.pngUrl = url; }); 所以用bind(this)锁定this的指向,然后发现程序运行正常

2.7K40

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

四、Step by Step 4.1、组件与模板 4.1.1、组件的基础概念 组件包含了一组特定的功能,每个组件的功能都单一且独立,可以进行重复使用;组件可以通过 angular cli 进行创建,生成的组件位于工作空间的...组件的成员信息(属性 or 方法) 在使用模板表达式时,如果变量名在多个来源中都存在的话,则模板变量是最优先的,其次是指令的上下文变量,最后是组件的成员 在使用模板表达式时应该遵循如下的原则 简单:正常情况下...4.4.3、父组件获取子组件信息 使用 @ViewChild 装饰器获取 在子组件上定义一个模板引用变量 父组件内容: 1、使用 @ViewChild 装饰器获取子组件数据...的引用,然后使用 @ViewChild 装饰器来接收子组件的 dom 信息,从而获取到子组件的数据或方法 // 引入 ViewChild import { Component, OnInit,...ViewChild } from '@angular/core'; @Component({ selector: 'app-parent-component', templateUrl: '.

15.8K30

Angular教程】组件动效u002F动态组件u002F视图封装模式

前言: 这一篇我们一起来了解一下和组件相关的其他几个概念,上手开发Angular的项目还是难免遇到了很多的坑,工作之余的话也准备整理一下。希望可以坚持吧,初识Angular,不当之处还请指正。...正文: 组件动效 Angular默认的动画模块使用的事Web Animations规范,需要注意兼容问题。...代码来动态组合组件 动态的组件也需要我们在父组件中提供一块区域: 看这块代码像不像React中创建Ref // 看这块代码像不像React中创建Ref @ViewChild...this.hwComp = this.container.createComponent(comp); } 接下来我们就可以使用hwComp.instance来对加载的组件做操作了, 使用完组件一定记得...不影响其他组件样式 Emulated模式(默认): 通过对CSS预处理来模拟ShadowDOM,达到样式隔离,模式的特点是接受全局样式的影像,但不影响其他组件样式 None: 样式会加载到全局,无作用域,无法达到隔了的效果

89340

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

:意思就是上面代码中绑定的 formControl 指令,在其自身实例化时,会调用 setUpControl() 函数给同样绑定到 input的 DefaultValueAccessor 指令做好安装工作...location> `, styles: ['div {width: 100px}'] }) export class NgxJquerySliderComponent { @ViewChild...上面的实现还不能让我们自定义的 slider 控件与父组件交互,所以还得使用输入/输出绑定来是实现组件间数据通信: export class NgxJquerySliderComponent { @ViewChild...一旦定义了提供者,就让我们实现 controlValueAccessor 接口: export class NgxJquerySliderComponent implements ControlValueAccessor...{ @ViewChild('location') location; widget; onChange; value; ngOnInit() { this.widget =

3.7K20

angular面试题及答案_angular面试

ngOninit:初始化指令或组件,在angular第一次显示展示组件的绑定属性调用,该方法只会调用一次 ngDocheck:检测 ngAfterContentInit:当把内容投影进组件之后调用,...9....Authorization(授权):登录成功,经过身份验证或真正的用户不能访问所有内容。用户未被授权访问其他人的数据,他/她被授权访问某些数据。 16. AOT编译 和JIT编译?...元数据(Metadata) 5、数据绑定(Data Binding) 6、指令(Directives) 7、服务(Services) 8、依赖注入(Dependency Injection) 9、...ContentChild 与 ViewChild 的异同点 相同点 都是属性装饰器 都有对应的复数形式装饰器:ContentChildren、ViewChildren 都支持 Type

10.9K120

SNS项目笔记--content滚动の坑

项目中,在使用滚动到底部的时候,一直使用其官方的scrollToBottom(),但是在实际运行的时候,总是无法显示出效果,这里就很奇怪了,官方也未做任何对于它的解释,为啥在同步情况下无法达到最终的效果...这里博主推荐用setTimeout进行处理handler,因为可以自己控制此耗时操作的时间,可以在网络请求数据并填充数据【这里angular通过数据绑定,进行domwrite操作,同样耗时,所以需要异步延迟处理...】,用来处理这样的耗时操作,于是有了以下代码: @ViewChild(Content) content :Content setTimeout (()=>{ content...._scoll.scrollToBottom()},1000) } } 最后看看处理的效果: ? 处理的效果.gif

77730

怎样切换不同版本的 Node

以下是你需要完成的任务: 修复程序 1 上的 bug x 将程序 2 升级到 Angular 8 实际上,你需要三个版本的 Node 才能完成任务,因为你需要将程序 2 升级到 Node 10.9或更高版本才能支持...例如,如果在一个版本的 Node 上全局安装软件包,则该软件包将无法在其他版本的 Node 上使用。...运行程序2 因此,你已在程序1中修复了错误 x,现在你已准备好将程序 2 升级到Angular 8: 1D:\nvm install 8.16.0 2... 3D:>nvm use 8.16.0...在 NVM(和 Angular CLI)的帮助下,你通过几个命令快速完成了升级: nvm install 和 nvm use 安装并激活 v8.16.0,以便你可以在升级之前验证程序是否能够按预期工作...然后按照 Angular 8 的要求安装 Node v10.16.0。全局安装 Angular CLI,使用 ng update 对程序进行更新。最后程序在升级开始测试。

4.1K30
领券