Sự khác biệt giữa thành phần và chỉ thị là gì?


86

Tôi mới bắt đầu làm việc với Angular 2.

Tôi đã tự hỏi sự khác biệt giữa các thành phần và chỉ thị trong Angular 2 là gì?


Điều này được giải thích trong tài liệu trên trang Chỉ thị thuộc tính , phần đầu tiên, "Tổng quan về chỉ thị".
Mark Rajcok

4
Có thể có bản sao của @Directive v / s @Component trong angle2
John

Câu trả lời:


105

Về cơ bản, có ba loại chỉ thị trong Angular2 theo tài liệu.

  • Thành phần
  • Chỉ thị cấu trúc
  • Chỉ thị thuộc tính

Thành phần

Nó cũng là một loại chỉ thị với khuôn mẫu, kiểu và phần logic, là loại chỉ thị nổi tiếng nhất trong số tất cả trong Angular2. Trong loại chỉ thị này, bạn có thể sử dụng các chỉ thị khác cho dù nó là tùy chỉnh hay nội trang trong @Componentchú thích như sau:

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

Sử dụng chỉ thị này theo quan điểm của bạn như:

<my-app></my-app>

Đối với chỉ thị thành phần, tôi đã tìm thấy hướng dẫn tốt nhất ở đây.

Chỉ thị cấu trúc

Thích *ngFor*ngIf, được sử dụng để thay đổi bố cục DOM bằng cách thêm và xóa các phần tử DOM. giải thích ở đây

Chỉ thị thuộc tính

Chúng được sử dụng để cung cấp hành vi hoặc phong cách tùy chỉnh cho các phần tử hiện có bằng cách áp dụng một số hàm / logic. Like ngStylelà một chỉ thị thuộc tính để cung cấp phong cách động cho các phần tử. Chúng tôi có thể tạo chỉ thị của riêng mình và sử dụng chỉ thị này làm thuộc tính của một số phần tử tùy chỉnh hoặc xác định trước, đây là ví dụ về một chỉ thị đơn giản:

Đầu tiên, chúng ta phải nhập chỉ thị từ @angular/core

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

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

Chúng ta có thể sử dụng điều này trong giao diện như hình dưới đây:

<span Icheck>HEllo Directive</span>

Để biết thêm thông tin, bạn có thể đọc hướng dẫn chính thức ở đâyở đây


Chỉ thị “bộ định tuyến-đầu ra” thuộc loại nào? Nó không khớp với IMO nào trong ba loại trên.
user2516186

1
ở đây chúng ta sẽ xem một hướng dẫn hay: dev6.com/angular/angular-2-the-three-types-of-directives
Flames

64

Các thành phần có chế độ xem riêng (HTML và các kiểu). Chỉ thị chỉ là "hành vi" được thêm vào các phần tử và thành phần hiện có.
Componentmở rộng Directive.

Do đó, chỉ có thể có một thành phần trên một phần tử máy chủ, nhưng có nhiều chỉ thị.

Các chỉ thị cấu trúc là các chỉ thị được áp dụng cho <template>các phần tử và được sử dụng để thêm / bớt nội dung (đóng dấu mẫu). Các *ứng dụng trong chỉ thị như *ngIfkhiến một <template>thẻ được tạo ngầm định.


7

Để hoàn thành những gì Günter đã nói, chúng ta có thể phân biệt hai loại chỉ thị:

  • Các cấu trúc cập nhật bố cục DOM bằng cách thêm hoặc bớt các phần tử. Hai cái phổ biến là NgForNgIf. Những cái này được liên kết với khái niệm mẫu và phải có tiền tố là một *. Xem phần "Mẫu và *" trong liên kết này để biết thêm chi tiết: http://victorsavkin.com/post/119943127151/angular-2-template-syntax
  • Các thuộc tính cập nhật hành vi xuất hiện của phần tử mà chúng được đính kèm.

Hy vọng nó sẽ giúp bạn, Thierry


2
Không thấy mục đích của chỉ thị thuộc tính. Họ cung cấp những gì ngoài CSS?
Tim McNamara

3
@TimMcNamara, Các chỉ thị Angular có thể có logic / phương thức, do đó bạn có thể làm được nhiều việc hơn với một chỉ thị thuộc tính so với chỉ CSS. Bạn có thể chuyển một số giá trị thuộc tính mẹ vào một chỉ thị thuộc tính và để phần tử xuất hiện hoặc hoạt động khác nhau dựa trên giá trị thuộc tính đó.
Mark Rajcok

Bạn có thể tìm thấy một ví dụ điển hình ở đây: angle.io/docs/ts/latest/guide/attribute-directives.html
Joris Brauns

6

Đây là định nghĩa thực tế.

  • Nếu nó có mẫu , nó là một Thành phần
  • khác nếu nó có bộ chọn trong dấu ngoặc vuông "[likethis]", thì đó là Chỉ thị thuộc tính
  • nếu không, nó là một Chỉ thị về cấu trúc .

Mọi định nghĩa khác đều sai.


3

Tóm lược:

Một thành phần là một chỉ thị với một khung nhìn được liên kết (tức là HTML sẽ được hiển thị). Tất cả các thành phần đều là chỉ thị, nhưng không phải tất cả các chỉ thị đều là thành phần. Có ba loại chỉ thị:

  • Thành phần : Chế độ xem có hành vi được liên kết. Loại chỉ thị này thực sự thêm các phần tử DOM
  • Các chỉ thị thuộc tính : Có thể được gắn vào các phần tử DOM (và các thành phần vì chúng là các phần tử DOM) để sửa đổi giao diện hoặc hành vi của một phần tử.
  • Chỉ thị cấu trúc : Có thể được đính kèm vào các phần tử DOM (và các thành phần vì chúng là các phần tử DOM) để sửa đổi bố cục DOM. Các chỉ thị cấu trúc bắt đầu bằng dấu * và thực sự thêm hoặc bớt phần tử DOM. Ví dụ: *ngIfcó thể chèn hoặc xóa phần tử DOM (hoặc thành phần góc là phần tử DOM tùy chỉnh, nhưng vẫn là phần tử DOM).

Thí dụ:

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;

}

Trong ví dụ trên, chúng ta có thể quan sát những điều sau:

  • Thành phần AppComponentcó một mẫu với một <div>phần tử sẽ hiển thị, chào bạn.
  • Chỉ thị thuộc tính HighlightDirective nằm trên <div>phần tử. Điều này có nghĩa là nó sẽ thao túng hành vi của <div>phần tử. Trong trường hợp này, nó sẽ đánh dấu văn bản và sẽ chuyển sang màu vàng.
  • Chỉ thị cấu trúc *ngIfcũng nằm trên <div>phần tử và sẽ xác định xem phần tử có được chèn hay không. Ý <div>muốn được hiển thị có điều kiện tùy thuộc vào việc liệu biểu thức myBoolcó thể bị ép buộc hay không true.

2

Angular 2 tuân theo mô hình kiến ​​trúc thành phần / dịch vụ.

Một ứng dụng 2 góc được làm bằng các thành phần. Thành phần là sự kết hợp của một mẫu HTML và một lớp thành phần (Lớp chỉ định kiểu) kiểm soát một phần của màn hình.

Để thực hành tốt, lớp thành phần được sử dụng để liên kết dữ liệu với dạng xem tương ứng. Liên kết dữ liệu hai chiều là một tính năng tuyệt vời được cung cấp bởi khung góc.

Các thành phần có thể được sử dụng lại trên ứng dụng của bạn bằng cách sử dụng tên bộ chọn được cung cấp.

Thành phần cũng là một loại chỉ thị với một khuôn mẫu.

Hai chỉ thị khác là

  1. Chỉ thị cấu trúc — thay đổi bố cục DOM bằng cách thêm và xóa các phần tử DOM. Ví dụ: NgForNgIf.

  2. Các chỉ thị thuộc tính — thay đổi giao diện hoặc hành vi của một phần tử, thành phần hoặc một chỉ thị khác. Ví dụ: NgStyle


0

Trên thực tế, các thành phần cũng là chỉ thị, nhưng có sự khác biệt giữa chúng.

Chỉ thị thuộc tính :

Các chỉ thị thuộc tính là các lớp có thể sửa đổi hành vi hoặc giao diện của một phần tử duy nhất. Để tạo một chỉ thị thuộc tính, hãy áp dụng @Directivecho một lớp.

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

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

export class CustomAttrDirective {

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

Thêm thuộc tính chỉ thị template.html Tệp

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

Chỉ thị về cấu trúc :

Các chỉ thị cấu trúc thay đổi bố cục của tài liệu HTML bằng cách thêm và xóa các phần tử, dưới dạng vi mẫu. Các chỉ thị cấu trúc cho phép nội dung được thêm vào có điều kiện dựa trên kết quả của một biểu thức chẳng hạn như *ngIfhoặc cho cùng một nội dung được lặp lại cho từng đối tượng trong nguồn dữ liệu chẳng hạn *ngFor.

Bạn có thể sử dụng các chỉ thị tích hợp sẵn cho các tác vụ thông thường, nhưng việc viết các chỉ thị cấu trúc tùy chỉnh cung cấp khả năng điều chỉnh hành vi cho ứng dụng của bạn.

<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>

Thành phần :

Các thành phần là các chỉ thị mà các mẫu của riêng chúng, thay vì dựa vào nội dung được cung cấp từ nơi khác. Các thành phần có quyền truy cập vào tất cả các tính năng chỉ thị, vẫn có một phần tử chủ, vẫn có thể xác định các thuộc tính đầu vào và đầu ra, v.v. Nhưng chúng cũng xác định nội dung của riêng mình.

Có thể dễ dàng đánh giá thấp tầm quan trọng của mẫu, nhưng các chỉ thị thuộc tính và cấu trúc có những hạn chế. Các chỉ thị có thể thực hiện công việc hữu ích và mạnh mẽ, nhưng chúng không có nhiều thông tin chi tiết về các yếu tố mà chúng được áp dụng. Các chỉ thị hữu ích nhất khi chúng là các công cụ có mục đích chung, chẳng hạn như ngModelchỉ thị, có thể được áp dụng cho bất kỳ thuộc tính mô hình dữ liệu nào và bất kỳ phần tử biểu mẫu nào, bất kể dữ liệu hoặc phần tử đang được sử dụng để làm gì.

Ngược lại, các thành phần được gắn chặt với nội dung của các mẫu của chúng. Các thành phần cung cấp dữ liệu và logic sẽ được sử dụng bởi các liên kết dữ liệu được áp dụng cho các phần tử HTML trong mẫu, cung cấp ngữ cảnh được sử dụng để đánh giá các biểu thức liên kết dữ liệu và hoạt động như chất kết dính giữa các lệnh và phần còn lại của ứng dụng. Các thành phần cũng là một công cụ hữu ích trong việc cho phép các dự án Angular lớn được chia thành các phần có thể quản lý được.

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;
}

từ góc chính thức

từ sách Pro-Angular

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.