Angular2进阶之如何避免Dom误区


Posted in Javascript onApril 02, 2018

前言

Angular2的设计目标本来就是要让浏览器和DOM独立。DOM是复杂的,因此使组件与它分离,会让我们的应用程序,更容易测试和重构。为了支持跨平台,Angular还通过抽象封装了不同平台的差异。

内容

1.为什么不能直接操作DOM?

Angular2采用AOT静态编译模式,这种形式下需要我们的模板类型必须是稳定和安全的,直接使用javascript和jquery语言是不稳定,因为他们的编译不会提前发现错误,所以angular2才会选择javascript的超集typescript语言(这种语言编译期间就能发现错误)。 

2.三种错误操作DOM的方式:

@Component({ ... })
export class HeroComponent {
 constructor(private _elementRef: ElementRef) {}

 doBadThings() {
  $('id').click(); //jquery
  this._elementRef.nativeElement.xyz = ''; //原生的ElementRef
  document.getElementById('id'); //javascript
 }
}

3.Angular2如何DOM操作的机制?

为了能够支持跨平台,Angular 通过抽象层封装了不同平台的差异。比如定义了抽象类 Renderer、Renderer2 、抽象类 RootRenderer 等。此外还定义了以下引用类型:ElementRef、TemplateRef、ViewRef 、ComponentRef 和 ViewContainerRef 等。 

4.正确操作DOM的方式(ElementRef和Renderer2):

product.component.html

<div>商品信息</div>
<ul>
 <li *ngFor="let product of dataSource| async as list">
  {{product.title}}
 </li>
</ul>
<div #dia>
</div>

product.component.ts

import { Component, OnInit,Renderer2, ViewChild,ElementRef,AfterViewInit} from '@angular/core';
@Component({
 selector: 'app-product',
 templateUrl: './product.component.html',
 styleUrls: ['./product.component.css']
})

export class ProductComponent implements OnInit,AfterViewInit {
 @ViewChild('dia') dia:ElementRef ;定义子试图
 ngOnInit() {
 /**1.
 *创建一个文本
 */
  this.dia.nativeElement.innerHTML="这只是一个测试的文档";

 /**2.
  *添加click事件
  */
 let ul=this.element.nativeElement.querySelector('ul');
  this.render2.listen(ul,"click",()=>{
   this.render2.setStyle(ul,"background","blue");

ngAfterViewInit(){
/**3.
 *修改背景颜色
 */
 let li=this.element.nativeElement.querySelector('ul');
 this.render2.setStyle(li,"background","red");
 }
}

总结

学习一种语言其实我们首先应该去遵循他的规范,接受他和之前语言的不同之处,然后再去深入理解和之前的方式不一样在哪里,为什么这么做,否则我们无法理解这种语言的妙处,希望对你有帮助!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
Apr 24 Javascript
Javascript快速排序算法详解
Dec 03 Javascript
浅谈javascript 迭代方法
Jan 21 Javascript
ES6中的数组扩展方法
Aug 26 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
Dec 08 Javascript
javascript 日期相减-在线教程(附代码)
Aug 17 Javascript
vue2 前端搜索实现示例
Feb 26 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
Mar 17 Javascript
js实现图片推拉门效果代码实例
May 18 Javascript
浅谈vue项目用到的mock数据接口的两种方式
Oct 09 Javascript
小程序如何自主实现拦截器的示例代码
Nov 04 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
Dec 12 Javascript
Vue项目分环境打包的实现步骤
Apr 02 #Javascript
详解webpack-dev-server的简单使用
Apr 02 #Javascript
webpack v4 从dev到prd的方法
Apr 02 #Javascript
vue axios登录请求拦截器
Apr 02 #Javascript
webpack+react+antd脚手架优化的方法
Apr 02 #Javascript
vue axios请求超时的正确处理方法
Apr 02 #Javascript
JavaScript 日期时间选择器一些小结
Apr 02 #Javascript
You might like
PHP4(windows版本)中的COM函数
2006/10/09 PHP
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
由php的call_user_func传reference引发的思考
2010/07/23 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
Jquery把获取到的input值转换成json
2017/05/15 jQuery
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
详解Python中的元组与逻辑运算符
2015/10/13 Python
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
Python日期时间Time模块实例详解
2019/04/15 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
高中自我评价分享
2013/12/05 职场文书
大家检讨书5000字
2014/02/03 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
体育教师研修感悟
2015/11/18 职场文书
详解python的内存分配机制
2021/05/10 Python
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python