美文网首页我爱编程
angular的Dom操作

angular的Dom操作

作者: 前端路上的小兵 | 来源:发表于2018-06-28 00:15 被阅读0次
大纲

1、angular的DOM操作
2、为什么不能直接操作DOM?
3、三种错误操作DOM的方式
4、angular2如何DOM操作的机制?
5、正确操作DOM的方式
6、为什么需要ElementRef
7、使用ElementRef的代码实例及优化
8、代码资源

angular的DOM操作

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

为什么不能直接操作DOM?

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

三种错误操作DOM的方式
@Component({ ... })
export class HeroComponent {
  constructor(private _elementRef: ElementRef) {}

  doBadThings() {
    $('id').click();  //jquery
    this._elementRef.nativeElement.xyz = ''; //原生的ElementRef
    document.getElementById('id'); //javascript
  }
}
angular2如何DOM操作的机制?

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

正确操作DOM的方式

angular通过ElementRef实现跨平台,用Renderer实现视图应用相分离,想必也是一种很赞的设计模式。

为什么需要ElementRef

angular一直在做的一件事情就是降低视图层和应用层之间的耦合,在应用层直接操作DOM,会导致应用层和视图层之间强耦合,导致我们不能将应用运行在不同的环境中。比如令js能够实现多线程的webWorker,在webWorker中,却不能直接操作DOM,angular为我们封装了一个对象,叫做ElementRef,能够获取到视图层中的native对象,比如在浏览器中,native对象就是DOM对象。

export class ElementRef {
  public nativeElement: any;
  constructor(nativeElement: any) { this.nativeElement = nativeElement; }
}
使用ElementRef的代码实例及优化
1、简单使用实例

通过this.elementRef.nativeElement.querySelector()获取元素节点,然后对元素及节点设置样式。

2、优化1

在ngAfterViewInit生命周期钩子中对DOM元素进行样式的初始化设置

3、优化2

利用ViewChild来获取Child DOM对象的引用。

4、优化3

angular为我们提供了一个叫做Renderer的对象,它作为视图层和应用层的粘合剂,能够使我们把视图层和应用层做到最大程度的分离。
通过注入Renderer,我们可以轻松的操作DOM,并且对视图层和应用的分离做到最大限度。

代码资源

在这里我就不粘贴源码了,这样整篇的篇幅会很大,这里我就将大概的原理粘贴出来。如果对Dom操作的代码有兴趣的读者可以从我的git上查看。angular实例代码中的angular-dom项目里就是该篇博客中提及的代码实例。

相关文章

  • angular控制器和指令

    Angular Angular vs jQuery 提高了dom操作的效率 不推崇dom操作 angular.el...

  • angular的Dom操作

    大纲 1、angular的DOM操作2、为什么不能直接操作DOM?3、三种错误操作DOM的方式4、angular2...

  • ViewContainerRef 动态创建视图

    Angular DOM 操作 相关的APIs和类: 查询DOM节点template variable ref: 模...

  • angular操作DOM

    AngularJS操作DOM -- jqLite Angular不鼓励依赖jQuery库,但是在应用中仍然使用它。...

  • angular dom操作

    angular dom操作 ElementRef获取不同平台视图native元素封装在ElementRef实例的n...

  • 在Angular中操作DOM:意料之外的结果及优化技术

    【翻译】在Angular中操作DOM:意料之外的结果及优化技术 原文链接:https://blog.angular...

  • angularjs基础知识

    angular的好处 1、节省劳动力 2、减少DOM操作 angular的特点 1、具备模块化 2、双向绑定 3、...

  • angular中直接操作DOM

    简介 一般情况下,在angular项目中不需要也不建议直接操作DOM,但有时也会遇到操作DOM的情况,angula...

  • angular 中的 DOM 操作

    在angular中使用第三方插件时最好都封装到指令(directives)中去,DOM操作也最好都解构到指令中。避...

  • Angular中的DOM操作

    Angular可以运行在不同的平台上--浏览器,移动平台或web worker。因此,站在平台特定的API和框架接...

网友评论

    本文标题:angular的Dom操作

    本文链接:https://www.haomeiwen.com/subject/xvrwyftx.html