コンポーネントに出力が存在するかどうかを確認します


14

次のコンポーネントを検討してください。

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

電話で:

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

selectedChange正しい出力名の代わりに書いたことに注意してくださいselectionChange。フラグをstrictTemplates有効にしたAngular 9 はまったく役に立ちませんでした。黙って失敗した。興味深いのは、に対して同じことを行う@Inputと、アプリがエラーをキャッチしてコンパイルされないことです。

存在しないものを「リッスン」しようとすると、エラーをスローする方法はあります@Outputか?


1
Angularの以前のバージョンでエラーはありましたか?私はそれがこれでどんなエラーも投げたことはなかったと思います
Aravind

@Aravindいいえ、エラーをスローしませんでした。それが可能かどうか尋ねています。前もって感謝します。
dev_054

なぜエラーをスローしたいのですか?特定のニーズはありますか?私はあなたの質問を理解しようとしています
アラビンド

@Aravindよく、私は多くの開発者と一緒にエンタープライズアプリに取り組んでいるので、何らかの情報/警告/エラーがあることが重要です。誰かが@Output()共有ライブラリのを変更/削除したり、アプリ上で呼び出しを削除するのを忘れたりすることがあります ...のようにコンパイルエラー@Input()がないため、特定の問題の原因を正確に見つけることができません(または、コードにゴミを残さないためにも)。単体テストは役に立ちますか?たぶん、しかし、その時のために、現時点ではまだ不可能です。
dev_054

回答:


3

ので、スローエラーがない結合事象の角には、だけではなく使用され@Output、SとEventEmitterSが、またを聞くためにDOMイベントのようなclickkeyupそれもを聞くために使用することができ、などのカスタムイベントが。たとえば、子コンポーネントでカスタムイベントを作成して発行する場合:

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

次に、親コンポーネントで名前でキャッチできます。

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

Angularはtarget.addEventListener(type、listener [、options]);を使用します。内部的に(以下のリンクを確認して確認typeできます)、任意の文字列を指定できます。

これが、一致するが見つからない場合に例外をスローしない理由@Outputです。

listenToElementOutputs

DefaultDomRenderer2.listen

EventManager.addEventListener

DomEventsPlugin.addEventListener


@Kirill Simonovさん、回答ありがとうございます。ええと、「Angularのイベントバインディングは@OutputsとEventEmittersだけでなく、クリック、キーアップなどのDOMイベントをリッスンするためにも使用されるため、エラーはスローされません。」 inexistent @Input()(入力が同じ特性を持っていることを覚えている:のようなグローバルなものにすることができdisabledidなど、)角度は、エラーを投げましたか?なぜで機能するが@Input、では機能しないの@Outputですか?また、存在しないもの@Outputが渡された場合にエラーを警告/スローする方法を見つけようとしています。
dev_054

@ dev_054これは、一連のプロパティがDOM要素、ディレクティブ、またはコンポーネントの既存のプロパティによって制限されるため、Angularがこのプロパティが存在するかどうかを簡単に確認できるためです。一方、イベントはを使用してバインドされていますaddEventListener(表示するために、回答にリンクをいくつか追加します)。意図的に行われたので、開発者は独自のカスタムイベントでイベントバインディングを使用できました。コンパイル時にこの動作を無効にする方法はないと思います。一部のIDE(IntelliJ Ideaなど)は、そのような場所を強調表示して警告を表示する場合があります。
Kirill Simonov

@ dev_054 では、を使用してHTML属性に一方向のバインディングを使用することもでき[attr.any-attribute]ます。この場合、エラーもスローされません。
Kirill Simonov

0

問題を直接解決する方法はありませんが、いくつかのケースをカバーできます。

  1. ボタンclickイベントのような場所の100%で使用される出力がある場合、それをセレクターの一部にすることができますselector: 'app-test[selectionChange]'。また、たとえば、これを行うことができます:selector: 'app-test[selectionChange]', app-test[click]'意味clickまたはselectionChange必須です。
  2. あなたは、コードおよびリネーム出力すなわちをリファクタリングしている場合selectionChangeselectedChange、あなたはこのセレクタを使用することができますselector: 'app-test:not([selectionChange])'力のユーザーに更新します。

-4

VS Codeを使用している場合は、この拡張機能をインストールできます。AngularLanguage Serviceは、メソッドまたはプロパティが定義されていない場合に警告をスローします。この拡張機能は、出力と入力(およびattrsなど)の両方で機能します。

識別子「XXXvalidateProvider」が定義されていません。


サンプルは@Inputを示しています。の場合@Output、Angular Language Serviceは何の役にも立ちません。質問を明確にする必要があるかどうかをお知らせください。
dev_054

以下のために@Output、あなたは、同じエラーメッセージが表示されます。
srgrcp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.