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 相关文章推荐
基于jQuery的可用于选项卡及幻灯的切换插件
Mar 28 Javascript
javascript中xml操作实现代码
Nov 21 Javascript
Ajax执行顺序流程及回调问题分析
Dec 10 Javascript
js函数排序的实例代码
Jul 01 Javascript
JS实现Fisheye效果动感放大菜单代码
Oct 21 Javascript
jQuery基于扩展简单实现倒计时功能的方法
May 14 Javascript
javascript js 操作数组 增删改查的简单实现
Jun 20 Javascript
阿里云ecs服务器中安装部署node.js的步骤
Oct 08 Javascript
初探js和简单隐藏效果的实例
Nov 23 Javascript
vue项目引入Iconfont图标库的教程图解
Oct 24 Javascript
JavaScript switch语句使用方法简介
Dec 30 Javascript
Vue开发环境跨域访问问题
Jan 22 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
php引用传值实例详解学习
2013/11/06 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
js不是基础的基础
2006/12/24 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
python调用fortran模块
2016/04/08 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
pandas多级分组实现排序的方法
2018/04/20 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
Python函数生成器原理及使用详解
2020/03/12 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
《唯一的听众》教学反思
2014/02/20 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
学雷锋日活动总结
2015/02/06 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python