【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

这里有本 Angular 修炼秘籍送你(三)

  • 2020-01-07
  • 本文字数:1803 字

    阅读完需:约 6 分钟

这里有本Angular修炼秘籍送你(三)

5. 测试用例定义的[id]变量,在组件的 ngOnInit()生命周期钩子拿不到

解决方法:在 ngAfterViewInit()生命周期钩子可以拿到。


用户写宿主 id 三种方式:


1)给 HTML 属性 id 赋字符串


<!-- 赋字符串 --><input id='mycheckbox' /><!-- 赋变量 --><input id='{{myId}}'/>
复制代码


2)给 HTML 属性 id 赋变量


<input [attr.id]='mycheckboxid'/>
复制代码


3)给 DOM 属性 id 赋变量


<input [id]='mycheckboxid'/>
复制代码


组件开发读写宿主 id 的三种方法:


1)读 HTML 属性 id(左右/上下滑动可查看全部代码)


constructor(@Attribute('id') public hostId ) {}
复制代码


2)写 HTML 属性 id


@HostBinding('attr.id') hostId: string;写DOM属性id@HostBinding('id') hostId: string;
复制代码


3)读写 DOM 属性 id(左右/上下滑动可查看全部代码)


constructor(private hostRef: ElementRef ) { }ngAfterViewInit() {     const id =  this.hostRef.nativeElement.id}
复制代码

6. 函数作为入参时候,函数尽量写成箭头函数形式

组件开发过程过需要修改或者读取组件属性或者方法时候,一定要写成箭头函数形式,不然会出现 this 指向问题。


比较常见的 2 种应用。


1)定时器:(左右/上下滑动可查看全部代码)


let timer = setInterval(() => {


startDist += motion.step * dir;


topy+= motion.step * dir;


if (Math.abs(startDist - startPoint)>= motion.distance) {


clearInterval(timer);


timer = null;


}


}, 1);


2)事件监听:(左右/上下滑动可查看全部代码)


document.addEventListener(‘mousemove’, this.mouseMoveHandlerFn);


private mouseMoveHandlerFn = ($event) => {


const option = this.config.options;


}

7. 组件通讯之子获取父的实例

应用场景:组件嵌套,子组件需要用到父组件的属性和方法。


组件嵌套形式如下面代码:


父组件的模板代码如下,父组件嵌套了子组件 app-child。


(左右/上下滑动可查看全部代码)


<div class="container">   <div *ngFor="let item in items">     <app-child [item]="item"></app-child>   </div></div>
复制代码


方案:在 constructor(构造函数)中使用 @Inject()依赖注入父组件。


如下面代码:


export class TiBtnItemComponent { constructor(   @Inject(TiBtnRadioCompontent) private btnRadio: TiBtnRadioCompontent ) {}}
复制代码


并且上面的方式是单例的(父组件下不管有几个子组件,父组件只实例化一次),但是这种方式只能注入一个组件实例。


在实际开发中,例如选择按钮组有多选按钮和单选按钮,这个时候就需要注入多个父组件。用上面同样的方式同时注入 2 个就会报如下错误:


原因如下:


当组件申请一个依赖时,Angular 从该组件本身的注入器开始,沿着依赖注入器的树往上找,直到找到第一个符合要求的提供商。如果找不到就会抛出一个错误。


解决方案:


在 @Inject()装饰前加 @Optional(),如下面代码:


(左右/上下滑动可查看全部代码)


export class TiBtnItemComponent { constructor(  @Optional()@Inject(TiBtnRadioCompontent) private btnRadio: TiBtnRadioCompontent,    @Optional() @Inject(TiBtnCheckboxCompontent) private btnRadio:TiBtnCheckboxCompontent     ) {}}
复制代码


解决原因:


当 Angular 找不到依赖时,@Optional 装饰器会告诉 Angular 继续执行,Angualr 会把此注入参数设置为 null(而不是默认的抛出错误的行为)。

8. 组件生命周期总结


如上图,为组件初始化各个生命周期执行顺序。其中紫色的生命周期只在组件初始化执行一次,绿色的会执行多次。


1)ngOnChanges 频率较低,仅监听用户对 @Input 变量的改变。注意:监听不到组件开发者在代码中对变量更改。可以考虑使用 @Input set 访问器方式,监听变量,所有改变都可以监听到。


2)ngDoCheck,触发频率超高。angular 自身监视[ngclass]数组变化,是放在这个生命周期。使用了 IterableDiffers 机制。其他什么情况适合放在这里,暂时不太清楚。


3)ngAfterContentChecked,ngAfterViewChecked 相对频率低。我们目前代码监听 Dom 属性变化,暂时放在这里了。不知道有没有更好办法监听 Dom 属性变化。


注意:如果在 ngAfterViewChecked 里面,改变了模板中使用的变量,此变量不一定能及时更新到试图。需要强制刷新 this.changeDetectorRef.detectChanges();


4)想监听数组和对象属性变化,angular 内部使用了 IterableDiffers 和 KeyValueDiffer。参考[ngClass]源码。


本转载自 Think 体验设计公众号。


原文链接:https://mp.weixin.qq.com/s/4bfahysRdH9pVST_UZ4cXg


2020-01-07 15:37455

评论

发布
暂无评论
发现更多内容

Linux热潮下,来呆猫云工作站玩转云上部署Linux工作流新思路

科技怪咖

基于SpringBoot的SSMP整合

SpringBoot 2 Mybatis-Plus 8月月更

低成本、强交互、沉浸式的云游戏,究竟如何实现?

阿里云视频云

视频云 云游戏

Docker下Prometheus和Grafana三部曲之二:细说Docker编排

程序员欣宸

Grafana Prometheus 8月月更

未来,人人都是创造者

石云升

开源 未来技术趋势 8月月更

云原生(二十五) | Kubernetes篇之Kubernetes(k8s)临时存储

Lansonli

云原生 k8s 8月月更

精细化资产管理

IT资讯搬运工

数字馆藏电子商务平台开发:如何发展数字藏品?

开源直播系统源码

软件开发 区块链技术 NFT 数字藏品 数字藏品开发

java的可变参数

TimeFriends

8月月更

合合信息对于表格识别与内容提炼技术理解及研发趋势

合合技术团队

人工智能 表格识别 合合信息

数字化转型别着急,先看看如何打通数据孤岛吧

雨果

数字化转型 打通数据孤岛

倒计时1天!计算巢软件免费试用中心发布,即刻报名!

阿里云弹性计算

计算巢 试用中心

{版本发布公告}HMS Core 6.6.0来啦

HMS Core

不容错过!什么是领域驱动设计?为什么落地这么难?

京东科技开发者

前端 代码 领域驱动模型DDD 中台架构 研发提效

如何学习一项新技术?

平凡人生

一个奇葩的线上问题,导致我排查了一天

艾小仙

Java elasticsearch 程序员 ELK

【JavaScript】:有关js类型转换的那些事...

翼同学

JavaScript 编程语言、 8月月更 学习分享

【Java·访问修饰符】:default、public、protected、private

翼同学

Java 学习 编程语言 8月月更

解决在 Spring Boot 中运行 JUnit 测试遇到的 NoSuchMethodError 错误

HoneyMoose

Http缓存原来如此,牛波牛波

知识浅谈

HTTP缓存 8月月更

豆瓣 TOP3 的 Python 书,千万别错过

图灵教育

《 合 成 大 西 瓜 》 重 制 版 !( 联 机 版 在 做 了 )

HullQin

CSS JavaScript html 前端 8月月更

Go-Excelize API源码阅读(二十)——SetDefinedName

Regan Yue

Go 开源 源码阅读 8月日更 8月月更

图文详解:内存总是不够,我靠HBase说服了Leader为新项目保驾护航

浅羽技术

数据库 大数据 微服务 HBase 8月月更

leetcode 594. Longest Harmonious Subsequence 最长和谐子序列(简单).md

okokabcd

LeetCode 算法与数据结构

NFT盲盒游戏商城交易系统开发技术

薇電13242772558

NFT 盲盒

App Push 通用测试方案

转转技术团队

测试工具

【数据结构实践】手把手带你实现 Python 自定义数组

迷彩

开源 数据结构 面向对象 数组操作 8月月更

【CSS】字体样式,包括字体系列、大小、修饰、粗细、简写...

翼同学

CSS 编程语言 8月月更

iofod——WeUI基础组件解析

独来独往

前端 低代码 开发工具 weui iofod

用两个栈实现队列

掘金安东尼

算法 前端 8月月更

这里有本Angular修炼秘籍送你(三)_文化 & 方法_Think体验设计_InfoQ精选文章