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 相关文章推荐
通过Unicode转义序列来加密,按你说的可以算是混淆吧
May 06 Javascript
Web前端设计模式  制作漂亮的弹出层
Oct 29 Javascript
文本框文本自动补全效果示例分享
Jan 19 Javascript
JS动画效果打开、关闭层的实现方法
May 09 Javascript
浅谈jQuery中setInterval()方法
Jul 07 Javascript
全面解析Bootstrap中transition、affix的使用方法
May 30 Javascript
详解Angular中$cacheFactory缓存的使用
Aug 19 Javascript
vue学习之Vue-Router用法实例分析
Jan 06 Javascript
js回调函数原理与用法案例分析
Mar 04 Javascript
如何实现vue的tree组件
Dec 03 Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 Vue.js
JavaScript前端面试组合函数
Jun 21 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/06/13 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
js 页面输出值
2008/11/30 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python进程类subprocess的一些操作方法例子
2014/11/22 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
python 循环数据赋值实例
2019/12/02 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
澳洲的UGG雪地靴超级市场:Uggs.com.au
2020/04/06 全球购物
个人授权委托书
2014/04/03 职场文书
优秀语文教师事迹
2014/05/18 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
Python中的tkinter库简单案例详解
2022/01/22 Python
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js