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 相关文章推荐
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
Jun 02 Javascript
json属性名为什么要双引号(个人猜测)
Jul 31 Javascript
AngularJS基础学习笔记之控制器
May 10 Javascript
jquery图片滚动放大代码分享(2)
Aug 28 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
May 11 Javascript
通俗解释JavaScript正则表达式快速记忆
Aug 23 Javascript
详解JavaScript中的数组合并方法和对象合并方法
May 11 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
Jul 17 Javascript
Vuex中的State使用介绍
Jan 19 Javascript
Vue表单之v-model绑定下拉列表功能
May 14 Javascript
Vue实现计算器计算效果
Aug 17 Javascript
vue/cli 配置动态代理无需重启服务的方法
May 20 Vue.js
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
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
php 进度条实现代码
2009/03/10 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
JavaScript 私有成员分析
2009/01/13 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
python复制与引用用法分析
2015/04/08 Python
Python中编写ORM框架的入门指引
2015/04/29 Python
pycharm远程调试openstack代码
2017/11/21 Python
python3.5 cv2 获取视频特定帧生成jpg图片
2019/08/28 Python
python判断链表是否有环的实例代码
2020/01/31 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
简述数组与指针的区别
2014/01/02 面试题
临床医学系毕业生推荐信
2013/11/09 职场文书
应届毕业生应聘自荐信
2013/12/07 职场文书
好学生评语大全
2014/05/05 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
计生工作先进事迹
2014/08/15 职场文书
公司领导班子对照材料
2014/08/18 职场文书
小学运动会通讯稿
2015/07/18 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
Python中Cookies导出某站用户数据的方法
2021/05/17 Python