Kiểm tra xem đầu ra có trên thành phần không


14

Hãy xem xét các thành phần sau:

@Component({
  selector: 'app-test'
  template: 'Hello!'
}}
export class TestComponent {
  @Output() readonly selectionChange = new EventEmitter<SomeTypeHere>();
}

Với cuộc gọi:

<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>

Lưu ý rằng tôi đã viết selectedChangethay vì tên đầu ra chính xác selectionChange. Angular 9 với cờ strictTemplatesđược kích hoạt không giúp tôi chút nào. Nó thất bại âm thầm. Phần thú vị là nếu tôi làm điều tương tự @Input, ứng dụng sẽ bắt lỗi và không biên dịch.

Có cách nào để đưa ra một lỗi nếu tôi cố gắng "lắng nghe" một cách không tồn tại @Output?


1
Có bất kỳ lỗi nào với các phiên bản trước của Angular không? Tôi nghĩ rằng nó không bao giờ ném bất kỳ lỗi nào về điều này
Aravind

@Aravind không, nó không bao giờ ném lỗi. Tôi đang hỏi nếu nó có thể. Cảm ơn trước.
dev_054

Tại sao bạn muốn ném lỗi? Có một nhu cầu cụ thể? Tôi đang cố gắng để hiểu câu hỏi của bạn
Aravind

@Aravind tốt, tôi đang làm việc trên một ứng dụng doanh nghiệp có nhiều nhà phát triển, vì vậy điều quan trọng là có một số loại thông tin / cảnh báo / lỗi. Đôi khi ai đó thay đổi / xóa một @Output()lib được chia sẻ hoặc thậm chí trên ứng dụng và quên xóa các cuộc gọi ... và vì chúng tôi không có lỗi biên dịch, như chúng tôi mắc phải @Input(), chúng tôi không thể tìm thấy chính xác nguyên nhân gây ra sự cố nhất định (hoặc thậm chí không giữ rác trong mã). Bài kiểm tra đơn vị có thể hữu ích? Có thể, nhưng tại thời điểm đó là không thể do thời gian.
dev_054

Câu trả lời:


3

Không có lỗi ném vì các sự kiện ràng buộc trong góc được sử dụng không chỉ với @Outputs và EventEmitters, mà còn để lắng nghe những sự kiện DOM như click, keyupvv Nó thậm chí có thể được sử dụng để lắng nghe sự kiện tùy chỉnh . Ví dụ: nếu bạn tạo và phát ra một sự kiện tùy chỉnh trong thành phần con:

constructor (private el: ElementRef) {}
ngOnInit(): void {
    const domEvent = new CustomEvent('selectedChange', { custom: true });
    this.el.nativeElement.dispatchEvent(domEvent);
}

Sau đó, trong thành phần cha mẹ, bạn có thể bắt nó bằng tên của nó:

<app-test (selectedChange)="selectedChangeHandler($event)"></app-test>

Angular sử dụng target.addEventListener (loại, người nghe [, tùy chọn]); bên trong (bạn có thể chắc chắn rằng nó nhìn vào các liên kết bên dưới), nơi typecó thể là bất kỳ chuỗi nào.

Đó là lý do tại sao nó không ném bất kỳ ngoại lệ nào nếu nó không tìm thấy @Outputs phù hợp .

lắng ngheEutOutputs

Mặc địnhDomRenderer2.listen

EventManager.addEventListener

DomEventsPlugin.addEventListener


Xin chào @Kirill Simonov cảm ơn câu trả lời của bạn! Chà, lấy tuyên bố của bạn: "Không có lỗi nào được ném vì ràng buộc sự kiện trong Angular không chỉ được sử dụng với @Outputs và EventEmitters, mà còn để lắng nghe các sự kiện DOM như nhấp chuột, gõ phím, v.v.", tại sao sau đó nếu bạn vượt qua một không tồn @Input()(hãy nhớ rằng đầu vào có đặc điểm giống nhau: có thể là một cái gì toàn cầu như disabled, id, vv) góc ném lỗi? Tại sao nó hoạt động cho @Input, nhưng không phải cho @Output? Ngoài ra, tôi đang cố gắng tìm cách cảnh báo / ném lỗi nếu một lỗi không tồn tại @Outputđược thông qua.
dev_054

@ dev_054 điều này là do tập hợp các thuộc tính bị giới hạn bởi các thuộc tính hiện có của một thành phần DOM, chỉ thị hoặc thành phần, vì vậy Angular có thể dễ dàng kiểm tra xem thuộc tính này có tồn tại hay không. Mặt khác, các sự kiện bị ràng buộc sử dụng addEventListener(tôi sẽ thêm một số liên kết vào câu trả lời của tôi để hiển thị nó). Tôi nghĩ rằng, nó đã được thực hiện có chủ ý, vì vậy các nhà phát triển có thể sử dụng ràng buộc sự kiện với các sự kiện tùy chỉnh của riêng họ. Tôi tin rằng không có cách nào để vô hiệu hóa hành vi này tại thời gian biên dịch. Mặc dù một số IDE (như IntelliJ Idea) có thể làm nổi bật những nơi như vậy và hiển thị các cảnh báo.
Kirill Simonov

@ dev_054 hãy nhớ rằng bạn cũng có thể sử dụng liên kết một chiều cho các thuộc tính HTML bằng cách sử dụng [attr.any-attribute], trong trường hợp này sẽ không có lỗi nào được đưa ra.
Kirill Simonov

0

Không có giải pháp trực tiếp cho vấn đề của bạn, tuy nhiên một số trường hợp có thể được bảo hiểm.

  1. Nếu bạn có bất kỳ đầu ra nào được sử dụng ở 100% các vị trí như clicksự kiện nút thì bạn có thể biến nó thành một phần của bộ chọn tức là selector: 'app-test[selectionChange]'. Ngoài ra, bạn có thể làm điều này ví dụ: selector: 'app-test[selectionChange]', app-test[click]'có nghĩa clickhoặc selectionChangeđược yêu cầu.
  2. Nếu bạn đang refactoring mã và đầu ra đổi tên ví dụ selectionChangeđể selectedChangesau đó bạn có thể sử dụng bộ chọn này: selector: 'app-test:not([selectionChange])'cho người dùng vũ lực để cập nhật.

-4

Nếu bạn đang sử dụng Mã VS, bạn có thể cài đặt tiện ích mở rộng này: Dịch vụ ngôn ngữ góc sẽ đưa ra cảnh báo khi phương thức hoặc thuộc tính không được xác định. Tiện ích mở rộng này hoạt động với cả, đầu ra và đầu vào (và attrs, v.v ...).

Mã định danh 'XXXvalidateProvider' không được xác định.


Mẫu của bạn hiển thị @Input. Đối với @Output, Dịch vụ ngôn ngữ góc không giúp được gì. Hãy cho tôi biết nếu bạn cần tôi làm rõ câu hỏi.
dev_054

Đối với một @Outputbạn sẽ thấy thông báo lỗi tương tự.
srgrcp
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.