@Directive v/s @Component in Angular
在角度上,
什么是用例,什么时候更喜欢一个用例而不是另一个用例?
@component需要视图,而@directive不需要。
指令i将@directive与选项
1 2 3 4 5 6 7 8 9 10 11 12 | import {Directive} from '@angular/core'; @Directive({ selector:"[logOnClick]", hostListeners: { 'click': 'onClick()', }, }) class LogOnClick { constructor() {} onClick() { console.log('Element clicked!'); } } |
使用方法如下:
1 | <button logOnClick>I log when clicked!</button> |
号组件
一个组件,而不是添加/修改行为,实际上创建了它自己的视图(DOM元素的层次结构),带有附加的行为。这方面的一个示例用例可能是联系人卡片组件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import {Component, View} from '@angular/core'; @Component({ selector: 'contact-card', template: ` {{name}} <p> {{city}} </p> ` }) class ContactCard { @Input() name: string @Input() city: string constructor() {} } |
使用方法如下:
1 | <contact-card [name]="'foo'" [city]="'bar'"></contact-card> |
。
当您想用自定义行为创建一组可重用的UI DOM元素时,可以编写一个组件。当您想编写可重用的行为来补充现有的DOM元素时,可以编写一个指令。
资料来源:
- @指令文件
- @组件文档
- 有用的博客文章
组件
指令
资料来源:
http://www.codeandyou.com/2016/01/difference-between-component-and-directive-in-angular2.html
组件是一个带有模板的指令,而
In Angular 2 and above,"everything is a component." Components are
the main way we build and specify elements and logic on the page,
through both custom elements and attributes that add functionality to
our existing components.
号
http://learnangular2.com/components/组件/
但是在Angular2+中有什么指示呢?
Attribute directives attach behaviour to elements.
There are three kinds of directives in Angular:
Components—directives with a template. Structural directives—change
the DOM layout by adding and removing DOM elements.Attribute directives—change the appearance or behaviour of an element,
component, or another directive.
号
https://angular.io/docs/ts/latest/guide/attribute-directives.html网站
因此,在Angular2和更高版本中,指令是向元素和组件添加功能的属性。
从angular.io查看下面的示例:
1 2 3 4 5 6 7 8 | import { Directive, ElementRef, Input } from '@angular/core'; @Directive({ selector: '[myHighlight]' }) export class HighlightDirective { constructor(el: ElementRef) { el.nativeElement.style.backgroundColor = 'yellow'; } } |
因此,它将通过添加黄色背景扩展组件和HTML元素,您可以使用它,如下所示:
1 2 | <p myHighlight>Highlight me! </p> |
。
但组件将创建具有以下所有功能的完整元素:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import { Component } from '@angular/core'; @Component({ selector: 'my-component', template: ` Hello my name is {{name}}. <button (click)="sayMyName()">Say my name</button> ` }) export class MyComponent { name: string; constructor() { this.name = 'Alireza' } sayMyName() { console.log('My name is', this.name) } } |
。
您可以使用它,如下所示:
1 | <my-component></my-component> |
在HTML中使用标记时,将创建此组件,并调用和呈现构造函数。
变更检测
只有
在编程环境中,指令向编译器提供指导,以改变它将如何处理输入,即改变某些行为。
"Directives allow you to attach behavior to elements in the DOM."
号
指令分为三类:
- 属性
- 结构
- 组件
是的,在角2中,组件是一种指令。据医生说,
"Angular components are a subset of directives. Unlike directives, components always have a template and only one component can be instantiated per an element in a template."
号
Angular2组件是Web组件概念的一个实现。Web组件由几个单独的技术组成。您可以将Web组件视为使用开放式Web技术创建的可重用用户界面小部件。
- 因此,在总结指令中,我们将行为附加到DOM中的元素的机制,由结构,属性和组件类型。
- 组件是允许我们利用Web组件功能,即重用性-在我们的应用程序中提供封装的、可重用的元素。
如果你参考官方的角度文件
1 | https://angular.io/guide/attribute-directives |
在角度上有三种指令:
随着应用程序的增长,我们发现很难维护所有这些代码。为了实现可重用性,我们将智能组件和哑组件中的逻辑分开,并使用指令(结构或属性)在DOM中进行更改。