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 相关文章推荐
ajax异步刷新实现更新数据库
Dec 03 Javascript
js call方法详细介绍(js 的继承)
Nov 18 Javascript
JavaScript中的style.cssText使用教程
Nov 06 Javascript
Jquery简单分页实现方法
Jul 24 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
Dec 04 Javascript
全面解析多种Bootstrap图片轮播效果
May 27 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
Dec 15 Javascript
原生JS实现垂直手风琴效果
Feb 19 Javascript
实现单层json按照key字母顺序排序的示例
Dec 06 Javascript
vue组件实现进度条效果
Jun 06 Javascript
学习RxJS之JavaScript框架Cycle.js
Jun 17 Javascript
JS为什么说async/await是generator的语法糖详解
Jul 11 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
PHP大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
PHP中Array相关函数简介
2016/07/03 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
让textarea自动调整大小的js代码
2011/04/12 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
原生js实现日期联动
2015/01/12 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
js如何改变文章的字体大小
2016/01/08 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
React key值的作用和使用详解
2018/08/23 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
Python编写屏幕截图程序方法
2015/02/18 Python
在Python的Flask框架中使用模版的入门教程
2015/04/20 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
python实现图片筛选程序
2018/10/24 Python
python数据挖掘需要学的内容
2019/06/23 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
关于逃课的检讨书
2014/01/23 职场文书
共产党员承诺书
2014/03/25 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
作风建设整改方案
2014/10/27 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书