组件和指令之间有什么区别?


Answers:


105

根据文档,Angular2中基本上有三种类型的指令。

  • 零件
  • 结构指令
  • 属性指令

零件

它也是一种带有模板,样式和逻辑部分的指令类型,这是Angular2中最著名的指令类型。在这种类型的指令中,您可以使用其他指令,无论它是自定义指令还是内置在@Component注释中,如下所示:

@Component({
    selector: "my-app"
    directives: [custom_directive_here]
})

在您的视图中将此指令用作:

<my-app></my-app>

对于组件指令,我在这里找到了最佳教程

结构指令

*ngFor和一样*ngIf,用于通过添加和删除DOM元素来更改DOM布局。在这里解释

属性指令

通过应用某些功能/逻辑,它们用于为现有元素赋予自定义行为或样式。LikengStyle是一个属性指令,用于为元素动态赋予样式。我们可以创建自己的指令并将其用作某些预定义或自定义元素的属性,这是一个简单指令的示例:

首先,我们必须从 @angular/core

import {Directive, ElementRef, Renderer, Input} from '@angular/core';

@Directive({
  selector: '[Icheck]',
})
export class RadioCheckbox {
   // custom logic here...
}

我们可以在视图中使用它,如下所示:

<span Icheck>HEllo Directive</span>

有关更多信息,您可以在此处此处阅读官方教程


“路由器出口”指令属于哪种类型?它与IMO都不符合以上三种类型。
user2516186 '18

1
这里我们有一个不错的教程:dev6.com/angular/angular-2-the-three-types-of-directives
Flames

64

组件具有自己的视图(HTML和样式)。指令只是添加到现有元素和组件中的“行为”。
Component延伸Directive

因此,主机元素上只能有一个组件,而必须有多个指令。

结构伪指令是应用于<template>元素的伪指令,用于添加/删除内容(标记模板)。类似*in指令的应用程序*ngIf会导致<template>隐式创建标签。


7

为了完成Günter所说的,我们可以区分两种指令:

希望对您有帮助,蒂埃里


2
没有看到属性指令的目的。除了CSS,他们还能提供什么?
蒂姆·麦克纳马拉

3
@ TimMcNamara,Angular指令可以具有逻辑/方法,因此与仅使用CSS相比,使用属性指令可以执行更多操作。您可以将某些父属性值传递到属性指令中,并根据该属性值使元素出现或行为不同。
Mark Rajcok '16

您可以在此处找到一个很好的示例:angular.io/docs/ts/latest/guide/attribute-directives.html
Joris

6

这是实际的定义。

  • 如果有模板,则为组件
  • 否则,如果在方括号“ [likethis]”中有一个选择器,则它是一个属性指令
  • 否则是结构性指令

任何其他定义都是错误的。


3

概要:

组件是具有关联视图(即要呈现的HTML)的指令。所有组件都是指令,但并非所有指令都是组件。指令分为三种:

  • 组件:具有相关行为的视图。这种类型的指令实际上添加了DOM元素
  • 属性指令:可以附加到DOM元素(和组件,因为它们是DOM元素),以修改元素的外观或行为。
  • 结构化指令:可以附加到DOM元素(和组件,因为它们是DOM元素)以修改DOM布局。结构化指令以*开头,实际上是添加或删除DOM元素。例如*ngIf,它可以插入或删除DOM元素(或角度组件,它是自定义DOM元素,但仍然是DOM元素)。

例:

import { Component, HostListener, HostBinding, Directive, ElementRef } from '@angular/core';

@Directive({
  selector: '[appHighlight]'
})
export class HighlightDirective {
  constructor(el: ElementRef) {
    el.nativeElement.style.backgroundColor = 'yellow';
 }
}

@Component({
  selector: 'app-root',
  template: `
    <div *ngIf='myBool' appHighlight>Hi there</div>
  `,
  styleUrls: ['./app.component.scss'],
})
export class AppComponent  {

  myBool:boolean = true;

}

在上面的示例中,我们可以观察到以下内容:

  • 该组件AppComponent具有一个模板,<div>其中包含一个在其中显示的元素。
  • 属性指令HighlightDirective位于<div>元素上。这意味着它将操纵<div>元素的行为。在这种情况下,它将突出显示文本并将其变为黄色。
  • 结构指令*ngIf也位于<div>元素上,它将确定是否要插入元素。在<div>将根据表达是否被有条件地示出myBool可被强制转换为true

2

Angular 2遵循架构的组件/服务模型。

Angle 2应用程序由组件组成。组件是HTML模板和控制屏幕一部分的组件类(Typescript类)的组合。

作为良好实践,组件类用于将数据绑定到相应的视图。双向数据绑定是angular框架提供的一项重要功能。

使用提供的选择器名称,组件可在您的应用程序中重用。

组件也是带有模板的指令。

其他两个指令是

  1. 结构化指令-通过添加和删除DOM元素来更改DOM布局。例如: NgForNgIf

  2. 属性指令-更改元素,组件或其他指令的外观或行为。例如: NgStyle


0

实际上,组件也是指令,但是它们之间存在差异。

属性指令

属性指令是能够修改单个元素的行为或外观的类。要创建属性指令,请将@Directive应用于类。

import { Directive, ElementRef } from "@angular/core";

@Directive({
     selector: "[custom-attr]", })

export class CustomAttrDirective {

   constructor(element: ElementRef) {
      element.nativeElement.classList.add("bg-success", "text-white");    
   } 
}

添加指令属性template.html文件

<tr *ngFor="let item of getProducts(); let i = index" custom-attr>
   <td>{{i + 1}}</td>
   <td>{{item.name}}</td>
</tr>

结构指令

结构指令通过添加和删除元素(如微型模板)来更改HTML文档的布局。结构指令允许根据表达式的结果有条件地添加内容,例如*ngIf或对于数据源中的每个对象重复相同的内容*ngFor

您可以将内置指令用于常见任务,但是编写自定义结构指令可为您的应用程序定制行为。

<p *ngIf="true">
  Expression is true and ngIf is true.
  This paragraph is in the DOM.
</p>
<p *ngIf="false">
  Expression is false and ngIf is false.
  This paragraph is not in the DOM.
</p>

组成部分

组件是它们自己的模板的指令,而不是依赖于其他地方提供的内容。组件可以访问所有指令功能,仍具有宿主元素,仍可以定义输入和输出属性等,但是它们还可以定义自己的内容。

容易低估模板的重要性,但是属性和结构指令具有局限性。指令可以完成有用而强大的工作,但对所应用的元素没有太多的了解。指令ngModel在用作通用工具(例如,指令)时最有用,该指令可以应用于任何数据模型属性和任何表单元素,而无需考虑数据或元素的用途。

相反,组件与模板的内容紧密相关。组件提供了数据和逻辑,这些数据和逻辑将由应用于模板中HTML元素的数据绑定使用,这些数据和逻辑提供用于评估数据绑定表达式的上下文,并充当指令与应用程序其余部分之间的粘合剂。组件也是允许将大型Angular项目分解为可管理块的有用工具。

import { Component, Input } from '@angular/core';

import { Hero } from './hero';

@Component({
  selector: 'app-hero-child',
  template: `
    <h3>{{hero.name}} says:</h3>
    <p>I, {{hero.name}}, am at your service, {{masterName}}.</p>
  `
})
export class HeroChildComponent {
  @Input() hero: Hero;
  @Input('master') masterName: string;
}

从官方角度

从Pro-Angular书中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.