写点什么

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

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

    阅读完需:约 5 分钟

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

开发组件期间遇到的问题

1. 使用组件的时候直接加在组件上的样式和样式类无效:

解决方案:给组件父容器上加样式或样式类,代码如下:


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


<div class="wrapper-content">   <h1>基本用法</h1>   <p-progressbar [animate]="animate" [value]="value" [maxValue]="maxValue"></p-progressbar></div>
复制代码

2. angular 样式封装

组件内部定义的样式类不影响组件外部。


采用的策略是:angular 在解析组件内部写的样式会加上_ngcontent-属性。这样不会全局污染。


打开控制台,查看 DOM 接口,在 head 标签中的 style 标签中会看到如下样式:


查看宿主元素也就是自定义的组件标签 DOM,如下图所示会加上_nghost-属性。


导致的问题是组件内部定义的样式类在宿主元素上不生效。


为解决上述为题 angualr 提供了三种样式封装策略。需要引入 ViewEncapsulation。


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


import { ViewEncapsulation } from’@angular/core’


具体方案:在元数据上加 encapsulation 属性。有下面三个值:


ViewEncapsulation. Emulated(仿真)


这是默认选项,通过 Angular 来模拟类似 Shadow DOM 的行为。不会影响全局样式。


ViewEncapsulation. Native(原生)


原先浏览器 ShadowDOM 行为。


ViewEncapsulation.None(无)


angular 无任何封装行为,会全局污染。

3. 如何给一个 DOM 节点上使用 2 个 ng-class

在 angular1.x 上只能有一个,并且只有一个生效。


Angular5 中有个替代方案如下:


[class.className]=”expression”可以写多个。


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


<div class="p-progress-bar" [class.p-no-animation]="!hasAnimation"[ngClass]="progressClass"></div>
复制代码

4. 如何实现接口的双向数据绑定(Two-WayData Binding)

双向数据绑定原理图:


双向绑定是由两个单向绑定组成:


模型 -> 视图数据绑定


视图 -> 模型事件绑定


Angular 2.x 及以上版本中 [] 实现了模型到视图的数据绑定,() 实现了视图到模型的事件绑


定。两个结合在一起 [()] 就实现了双向绑定。就好比[(ngModel)]。


1)在 angular1.x 中可以按照下面的方式实现接口的数据绑定,通过‘=’修饰符表示这个数据双向绑定


如下代码,定义接口的时候使用‘=’


scope: { format:  ‘=?’}
复制代码


2)在 angular2.x 以上的版本实现方式有下面两种


第一种,Input 和 output 装饰器结合使用


实现方案:


I.定义一个 Input 输入属性,定义一个 Output 输出的事件接口,名称之间形式如下:


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


@Input() stated : boolean;


@Output() statedChange = new EventEmitter();II.在内部修改 stated 的时候把这个值,把这个值通知到外部。


private toggleSwitch(): void {  this.stated = !this.stated;  this.statedChange.emit(this.stated);}
复制代码


III.使用的时候形式如下


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


<p-switch name=“state” [(stated)]=“stated”>


原理如下:


[(stated)] 可以拆分成两部分 stated 和 statedChange,[stated]用于绑定输入属性,(statedChange)用于绑定输出属性。当 Angular 在解析模板时,遇到 [(stated)] 形式的绑定语法,它会期待这个指令中会存在一个名为 stated 的输入属性和一个名为 statedChange 的输出属性。


第二种,创建类表单组件


推荐学习地址(复制链接到浏览器打开):


https://segmentfault.com/a/1190000009070500


把这个组件当中最重要的接口定义成双向数据绑定,如下方式使用:


双向数据绑定的值用[(ngModel)]=”xxx”绑定实现。


使用形式如下(就好比原生的 textarea 标签)


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


<p-spinner name="state" [(ngModel)]="value"></p-spinner >
复制代码


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


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


2020-01-07 15:36989

评论

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

YMatrix v5.0 发布:138 项深度优化,重塑集群架构,实现性能及高可用性全方位提升!

YMatrix 超融合数据库

OLAP OLTP 超融合数据库 数据库架构设计 YMatrix

累计装机超过300万套 欧拉操作系统跨越生态拐点

极客天地

喜讯!云起无垠获评《2022年度十大新锐企业》

云起无垠

Fuzzing 2022年度十大新锐企业

基于开源体系的云原生微服务治理实践与探索

阿里巴巴云原生

阿里云 开源 云原生 service mesh

站酷基于服务网格ASM的生产实践

阿里巴巴云原生

阿里云 云原生 服务网格

云渲染市场安全吗?如何保证数据安全、财产安全?

Renderbus瑞云渲染农场

云渲染 云渲染农场 云渲染安全

IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf

JackJiang

即时通讯 protobuf im开发

Apache Tomcat 存在 JsonErrorReportValve 注入漏洞(CVE-2022-45143)

墨菲安全

安全漏洞 CVE

金融数字化为何需要低代码开发平台

力软低代码开发平台

IoT物联网设备「固件升级」OTA,「资源包更新」最佳实践——实践类

阿里云AIoT

运维 物联网 数据格式

安畅SmartOps混合云平台架构的演进之道

安畅Anchnet

云原生

一文了解华为FusionInsight MRS HBase的集群隔离方案RSGroup

华为云开发者联盟

大数据 后端 华为云 企业号 1 月 PK 榜

强强联手 | 尚硅谷&腾讯云EMR离线数仓教程发布

小谷哥

划重点,2023 年最值得关注的 8 大技术趋势

PreMaint

人工智能 云计算 5G 技术趋势 元宇宙

Hands on HTML & CSS

无人之路

CSS html

Apache RocketMQ 斩获 InfoQ 2022 年度十大开源新锐项目

阿里巴巴云原生

阿里云 云原生 Apache RocketMQ

2023 年openEuler 社区技术委员会增选,新增2位委员

openEuler

Linux 开源 操作系统 openEuler 资讯

IoT物联网平台「设备影子」开发实战——实践类

阿里云AIoT

JavaScript json 物联网 API 储存

直播 | StarRocks 联合腾讯云分享 EMR-StarRocks 的降本增效之路

StarRocks

数据库

为什么说 数据服务是数据中台的标配?

用友BIP

从 Nginx Ingress 窥探云原生网关选型

阿里巴巴云原生

阿里云 微服务 云原生

1月10日 KaiwuDB 1.0 线上发布会

KaiwuDB

硅基仿生业务全面 Serverless 容器化,14万+问答库助力糖尿病科普

阿里巴巴云原生

阿里云 Serverless 云原生

EMQ携“云边协同IIoT解决方案”亮相2022世界工业互联网产业大会

EMQ映云科技

人工智能 物联网 IoT 云边协同 企业号 1 月 PK 榜

2023年AI十大展望:GPT-4领衔大模型变革,谷歌拉响警报,训练数据告急

OneFlow

人工智能 深度学习

重磅发布丨从云原生到Serverless,先行一步看见更大的技术想象力

阿里巴巴云原生

阿里云 Serverless 云原生

这里有本Angular修炼秘籍送你(二)_语言 & 开发_Think体验设计_InfoQ精选文章