@Directive vs @Component เป็น Angular


443

ความแตกต่างระหว่าง@Componentและ@Directiveในเชิงมุมคืออะไร? ทั้งคู่ดูเหมือนจะทำงานเดียวกันและมีคุณสมบัติเหมือนกัน

กรณีการใช้งานคืออะไรและควรเลือกใช้อีกกรณีหนึ่ง?


13
องค์ประกอบที่เป็นคำสั่งที่มีแม่แบบและ@Componentมัณฑนากรที่เป็นจริงเป็น@Directiveมัณฑนากรที่มีคุณสมบัติขยายแม่แบบที่มุ่งเน้น - แหล่งที่มา
Cosmin Ababei

2
Directive vs Component เป็น Service vs Factory ใหม่ ความสับสนก็เพิ่มขึ้นเช่นกันเพราะเมื่อต้องการส่วนประกอบอื่น ๆ จากคำจำกัดความขององค์ประกอบที่คุณระบุไว้ในdirectivesอาเรย์ ... บางทีความคิดเห็นของ Lida Weng ด้านล่างช่วยอธิบายได้เล็กน้อยว่าองค์ประกอบ "จริงๆแล้วมันเป็น 'Directive'"
Nobita

1
ส่วนประกอบขยายคำสั่งจริงพวกเขาเพียงแค่ต้องให้คุณมีเทมเพลต (HTML) ซึ่งตรงข้ามกับคำสั่ง .. ดังนั้นคุณจึงใช้คำสั่งเพื่อแก้ไของค์ประกอบ html ที่มีอยู่และส่วนประกอบทำให้องค์ประกอบ HTML
Marko Niciforovic

คำตอบ:


546

@Component ต้องการมุมมองในขณะที่ @Directive ไม่

directives

ฉันเปรียบเสมือน @Directive ถึง Angular 1.0 directive พร้อมตัวเลือกrestrict: 'A' (คำสั่งไม่ จำกัด เฉพาะการใช้งานแอตทริบิวต์) Directives เพิ่มลักษณะการทำงานให้กับองค์ประกอบ DOM ที่มีอยู่หรืออินสแตนซ์ขององค์ประกอบที่มีอยู่ ตัวอย่างการใช้กรณีหนึ่งสำหรับคำสั่งคือการบันทึกการคลิกบนองค์ประกอบ

import {Directive} from '@angular/core';

@Directive({
    selector: "[logOnClick]",
    hostListeners: {
        'click': 'onClick()',
    },
})
class LogOnClick {
    constructor() {}
    onClick() { console.log('Element clicked!'); }
}

ซึ่งจะใช้เช่นนั้น:

<button logOnClick>I log when clicked!</button>

ส่วนประกอบ

องค์ประกอบแทนที่จะเพิ่ม / ปรับเปลี่ยนพฤติกรรมจะสร้างมุมมองของตัวเอง (ลำดับชั้นขององค์ประกอบ DOM) ด้วยพฤติกรรมที่แนบมา ตัวอย่างการใช้กรณีนี้อาจเป็นส่วนประกอบของบัตรข้อมูลที่ติดต่อ:

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

@Component({
  selector: 'contact-card',
  template: `
    <div>
      <h1>{{name}}</h1>
      <p>{{city}}</p>
    </div>
  `
})
class ContactCard {
  @Input() name: string
  @Input() city: string
  constructor() {}
}

ซึ่งจะใช้เช่นนั้น:

<contact-card [name]="'foo'" [city]="'bar'"></contact-card>

ContactCardเป็นส่วนประกอบ UI ที่สามารถใช้ซ้ำได้ซึ่งเราสามารถใช้ได้ทุกที่ในแอปพลิเคชันของเราแม้จะอยู่ในส่วนประกอบอื่น ๆ โดยพื้นฐานแล้วสิ่งเหล่านี้ประกอบเป็นหน่วยการสร้าง UI ของแอปพลิเคชันของเรา

สรุป

เขียนส่วนประกอบเมื่อคุณต้องการสร้างชุด DOM องค์ประกอบของ UI ที่สามารถนำกลับมาใช้ใหม่ได้พร้อมกับพฤติกรรมที่กำหนดเอง เขียนคำสั่งเมื่อคุณต้องการเขียนพฤติกรรมการใช้ซ้ำเพื่อเสริมองค์ประกอบ DOM ที่มีอยู่

แหล่งที่มา:


2
คำอธิบายประกอบ @directive มีคุณสมบัติเทมเพลต / templateUrl หรือไม่
Pardeep jain

7
คำตอบนี้ยังคงเป็นจริงหรือไม่? บทช่วยสอน angular2 สร้างองค์ประกอบโดยไม่มีมุมมอง
Tamas Hegedus

มันไม่มีมุมมอง แต่ templateurl หรือแม่แบบมีผลบังคับใช้ในองค์ประกอบ
Luca Trazzi

4
ฉันชอบคำตอบประเภทนี้ แต่ฉันจะขอบคุณการอัปเดตเมื่อการเปลี่ยนแปลงที่สำคัญเกิดขึ้นกับเฟรมเวิร์ก
Memet Olsen

สิ่งนี้จะต้องมีการเปลี่ยนแปลงเล็กน้อย API เชิงมุม 2 มีการเปลี่ยนแปลง ไม่มีตัวตกแต่งมุมมองอีกต่อไป
DaSch

79

ส่วนประกอบ

  1. ในการลงทะเบียนส่วนประกอบเราใช้@Componentคำอธิบายประกอบ meta-data
  2. Component เป็นคำสั่งที่ใช้เงา DOM เพื่อสร้างพฤติกรรมการมองเห็นแบบห่อหุ้มที่เรียกว่าส่วนประกอบ โดยทั่วไปจะใช้ส่วนประกอบในการสร้างวิดเจ็ต UI
  3. ส่วนประกอบถูกใช้เพื่อแยกแอปพลิเคชันออกเป็นส่วนประกอบที่เล็กลง
  4. สามารถมีได้เพียงหนึ่งองค์ประกอบต่อองค์ประกอบ DOM
  5. @View เทมเพลตมัณฑนากรหรือเทมเพลตมีผลบังคับใช้ในส่วนประกอบ

คำสั่ง

  1. ในการลงทะเบียนคำสั่งเราใช้@Directiveคำอธิบายประกอบ meta-data
  2. Directive ใช้เพื่อเพิ่มพฤติกรรมให้กับองค์ประกอบ DOM ที่มีอยู่
  3. Directive ใช้เพื่อออกแบบส่วนประกอบที่สามารถใช้งานซ้ำได้
  4. คำสั่งจำนวนมากสามารถใช้ต่อองค์ประกอบ DOM
  5. Directive ไม่ได้ใช้มุมมอง

แหล่งที่มา:

http://www.codeandyou.com/2016/01/difference-between-component-and-directive-in-Angular2.html


5
ส่วนประกอบ - จุดที่ 4 ฉันคิดว่าผิด - สามารถใช้งานได้หลายครั้ง จริงๆแล้วมันเป็น 'Directive' ที่ขยาย
Lida Weng

อาจขยายตัวอย่างนี้ด้วยตัวอย่าง
Mukus

มันไม่เสมอ Shadow Dom ขึ้นอยู่กับการห่อหุ้มมุมมอง
Anirudha

63

ส่วนประกอบคือคำสั่งพร้อมกับแม่แบบและ@Componentมัณฑนากรเป็นจริง@Directiveมัณฑนากรขยายด้วยคุณสมบัติที่มุ่งเน้นแม่แบบ


3
ไม่แน่ใจว่าทำไมคุณลงคะแนนมากเกินไป ดูเหมือนว่า @Component เป็นคำสั่งที่มีแม่แบบ (เพื่อสร้างมุมมอง) สำหรับฉัน
Harry Ninh

22

ใน Angular 2 ขึ้นไป“ ทุกอย่างเป็นองค์ประกอบ” ส่วนประกอบเป็นวิธีหลักที่เราสร้างและระบุองค์ประกอบและตรรกะบนหน้าผ่านทั้งองค์ประกอบที่กำหนดเองและคุณลักษณะที่เพิ่มฟังก์ชันการทำงานให้กับองค์ประกอบที่มีอยู่ของเรา

http://learnangular2.com/components/

แต่มีคำสั่งอะไรใน Angular2 +?

แอตทริบิวต์คำสั่งแนบพฤติกรรมกับองค์ประกอบ

มีคำสั่งสามประเภทในเชิงมุม:

  1. ส่วนประกอบ - คำสั่งพร้อมด้วยแม่แบบ
  2. คำสั่งโครงสร้าง - เปลี่ยนเค้าโครง DOM โดยการเพิ่มและลบองค์ประกอบ DOM
  3. คุณสมบัติของคำสั่ง - เปลี่ยนรูปลักษณ์หรือพฤติกรรมขององค์ประกอบองค์ประกอบหรือคำสั่งอื่น

https://angular.io/docs/ts/latest/guide/attribute-directives.html

ดังนั้นสิ่งที่เกิดขึ้นใน Angular2 ขึ้นไปคือDirectivesคือคุณลักษณะที่เพิ่มฟังก์ชันการทำงานให้กับองค์ประกอบและส่วนประกอบส่วนประกอบ

ดูตัวอย่างด้านล่างจาก Angular.io:

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

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

ดังนั้นมันจะขยายองค์ประกอบและองค์ประกอบ HTML ของคุณด้วยการเพิ่มพื้นหลังสีเหลืองและคุณสามารถใช้งานได้ดังต่อไปนี้:

<p myHighlight>Highlight me!</p>

แต่ส่วนประกอบต่างๆจะสร้างองค์ประกอบที่สมบูรณ์พร้อมฟังก์ชั่นทั้งหมดดังนี้:

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

@Component({
  selector: 'my-component',
  template: `
    <div>Hello my name is {{name}}. 
      <button (click)="sayMyName()">Say my name</button>
    </div>
   `
})
export class MyComponent {
  name: string;
  constructor() {
    this.name = 'Alireza'
  }
  sayMyName() {
    console.log('My name is', this.name)
  }
}

และคุณสามารถใช้มันได้ด้านล่าง:

<my-component></my-component>

เมื่อเราใช้แท็กใน HTML ส่วนประกอบนี้จะถูกสร้างขึ้นและตัวสร้างจะถูกเรียกและแสดงผล


7

เปลี่ยนการตรวจจับ

เพียง แต่@Componentอาจจะเป็นโหนดในต้นไม้การตรวจสอบการเปลี่ยนแปลง ซึ่งหมายความว่าคุณไม่สามารถตั้งค่าในChangeDetectionStrategy.OnPush @Directiveแม้จะมีข้อเท็จจริงนี้คำสั่งสามารถมี@Inputและ@Outputคุณสมบัติและคุณสามารถฉีดและจัดการองค์ประกอบของโฮสต์ChangeDetectorRefจากมัน ดังนั้นใช้ส่วนประกอบเมื่อคุณต้องการการควบคุมที่ละเอียดกว่าโครงสร้างการตรวจจับการเปลี่ยนแปลงของคุณ


6

ในบริบทของการเขียนโปรแกรมคำสั่งให้คำแนะนำแก่คอมไพเลอร์เพื่อปรับเปลี่ยนวิธีการประมวลผลอินพุตหรือเปลี่ยนแปลงพฤติกรรมบางอย่าง

“ คำสั่งอนุญาตให้คุณแนบลักษณะการทำงานกับองค์ประกอบใน DOM”

คำสั่งถูกแบ่งออกเป็น 3 หมวดหมู่:

  • คุณลักษณะ
  • โครงสร้าง
  • ตัวแทน

ใช่ใน Angular 2 Components เป็นประเภทของ Directive ตามเอกสาร

“ ส่วนประกอบเชิงมุมเป็นส่วนหนึ่งของคำสั่ง ไม่เหมือนกับคำสั่งส่วนประกอบจะมีแม่แบบเสมอและมีเพียงองค์ประกอบเดียวเท่านั้นที่สามารถสร้างอินสแตนซ์ต่อองค์ประกอบในแม่แบบได้”

คอมโพเนนต์ Angular 2 เป็นการใช้งานของแนวคิดWeb Component คอมโพเนนต์ของเว็บประกอบด้วยเทคโนโลยีแยกต่างหากหลายอย่าง คุณสามารถนึกถึง Web Components เป็นวิดเจ็ตส่วนต่อประสานผู้ใช้ที่สร้างขึ้นใหม่โดยใช้เทคโนโลยีเว็บเปิด

  • ดังนั้นในคำสั่งสรุปกลไกที่เราแนบพฤติกรรมกับองค์ประกอบใน DOM ประกอบด้วยประเภทโครงสร้างแอตทริบิวต์และส่วนประกอบ
  • ส่วนประกอบเป็นประเภทเฉพาะของคำสั่งที่ช่วยให้เราสามารถใช้ฟังก์ชั่นการใช้งานเว็บองค์ประกอบ AKA สามารถนำไปใช้ - องค์ประกอบที่ห่อหุ้มและนำมาใช้ซ้ำได้ตลอดทั้งแอปพลิเคชันของเรา

2

ถ้าคุณอ้างอิงเอกสารเชิงมุมอย่างเป็นทางการ

https://angular.io/guide/attribute-directives

มีคำสั่งสามประเภทในเชิงมุม:

  1. ส่วนประกอบ - คำสั่งพร้อมด้วยแม่แบบ
  2. คำสั่งโครงสร้าง - เปลี่ยนเค้าโครง DOM โดยการเพิ่มและลบองค์ประกอบ DOM เช่น * ngIf
  3. คุณสมบัติของคำสั่ง - เปลี่ยนรูปลักษณ์หรือพฤติกรรมขององค์ประกอบองค์ประกอบหรือคำสั่งอื่น เช่น [ngClass]

เมื่อแอปพลิเคชันเติบโตขึ้นเราพบปัญหาในการบำรุงรักษารหัสเหล่านี้ทั้งหมด เพื่อวัตถุประสงค์ในการนำกลับมาใช้ใหม่เราแยกตรรกะของเราในส่วนประกอบอัจฉริยะและส่วนประกอบโง่และเราใช้คำสั่ง (โครงสร้างหรือคุณลักษณะ) เพื่อทำการเปลี่ยนแปลงใน DOM


1

ส่วนประกอบ

ส่วนประกอบเป็นโครงสร้างพื้นฐาน UI พื้นฐานที่สุดของแอพเชิงมุม แอปพลิเคชันเชิงมุมมีโครงสร้างของส่วนประกอบเชิงมุม โปรแกรมของเราในเชิงมุมถูกสร้างขึ้นบนต้นไม้องค์ประกอบ ทุกองค์ประกอบควรมีเทมเพลตสไตล์วงจรชีวิตตัวเลือก ฯลฯดังนั้นทุกองค์ประกอบมีโครงสร้างของมันคุณสามารถปฏิบัติต่อมันเป็นเว็บแอพพลิเคชั่นขนาดเล็กที่แยกจากกันพร้อมด้วยแม่แบบและตรรกะของตัวเองและความเป็นไปได้ในการสื่อสาร ส่วนประกอบ

ตัวอย่างไฟล์. ts สำหรับคอมโพเนนต์:

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

@Component({
    // component attributes
    selector: 'app-training',
    templateUrl: './app-training.component.html',
    styleUrls: ['./app-training.component.less']
})

export class AppTrainingComponent {
    title = 'my-app-training';
}

และ. /app.component.html มุมมองเทมเพลต:

Hello {{title}}

จากนั้นคุณสามารถแสดงเทมเพลต AppTrainingComponent ด้วยตรรกะในส่วนประกอบอื่น ๆ (หลังจากเพิ่มลงในโมดูล)

<div>
   <app-training></app-training>
</div>

และผลลัพธ์จะเป็น

<div>
   my-app-training
</div>

เนื่องจาก AppTrainingComponent ถูกแสดงที่นี่

ดูเพิ่มเติมเกี่ยวกับส่วนประกอบ

directives

คำสั่งจะเปลี่ยนลักษณะหรือพฤติกรรมขององค์ประกอบ DOM ที่มีอยู่ ตัวอย่างเช่น [ngStyle] เป็นคำสั่ง Directives สามารถขยายส่วนประกอบ (สามารถนำมาใช้ในพวกเขา) แต่พวกเขาไม่ได้สร้างแอพลิเคชันทั้งหมด สมมติว่าพวกเขาสนับสนุนองค์ประกอบ พวกเขาไม่มีเทมเพลตของตัวเอง (แต่แน่นอนว่าคุณสามารถจัดการเทมเพลตกับพวกเขาได้)

คำสั่งตัวอย่าง:

@Directive({
  selector: '[appHighlight]'
})
export class HighlightDirective {

  constructor(private el: ElementRef) { }

  @Input('appHighlight') highlightColor: string;

  @HostListener('mouseenter') onMouseEnter() {
    this.highlight(this.highlightColor || 'red');
  }

  private highlight(color: string) {
    this.el.nativeElement.style.backgroundColor = color;
  }
}

และการใช้งาน:

<p [appHighlight]="color" [otherPar]="someValue">Highlight me!</p>

ดูเพิ่มเติมเกี่ยวกับคำสั่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.