Angularコンポーネントの「プライベート」と「パブリック」


120

、、、およびの前にプライベートを追加しない場合、デフォルトでパブリックであると思います。fooloadBartext

export class RandomComponent {
  @Input() foo: string;
  @Output() loadBar = new EventEmitter();
  text: string;
}

それらがpublicコンポーネント内にあるときにユースケースはありますか?

カプセル化/セキュリティ上の理由から、private以下のようにそれらすべてを常に追加する必要がありますか?

export class RandomComponent {
  @Input() private foo: string;
  @Output() private loadBar = new EventEmitter();
  private text: string;
}

ありがとう


簡単に言うと、プライベート関数はコンポーネントでのみ使用できます。他のコンポーネントからプライベート関数にアクセスすることはできません。サービス中で、関数がPrivateとして宣言されている場合、他のコンポーネントからアクセスできないと仮定します。
ケビン

回答:


202

この質問に答えるために言うべきことがたくさんあります、これらは私の心に飛びついた最初の考えです:

private何よりもまず、これはコンパイル時の構造にすぎないことに注意してください-実行時に強制することはできません(関連する議論については、ここここを参照してください)。そのprivateため、セキュリティの目的で何らかの形で有用であるという概念を誤解しないでください。それは単にそれが何であるかではありません。

それカプセル化についてであり、コンポーネントにカプセル化したいフィールドまたはメソッドがあり、それがどこからもアクセスされるべきではないことを明確にしている場合、絶対にそれを作成する必要がありますprivate。それprivateが理由です。それはあなたがそれを置いたものは何でもクラスの外から触れられるべきではないというあなたの意図を示しています。

同じpublicことがpublic当てはまります。これもコンパイル時のみの構文なので、クラスメンバーがデフォルトでtrueであるにもかかわらず、実行時にまったく意味がありません。ただし、クラスのAPIの一部として明示的に外部に公開するつもりのメンバーがある場合は、publicこの意図を示すために必ずメンバーを作成する必要があります。それpublicが目的です。

これはすべてTypescript全般に当てはまります。具体的には、Angularでは、コンポーネントクラスにパブリックメンバーを配置するための確かに有効なユースケースがあります。たとえば、コンテナー/コンポーネント(別名smart / dumb)パターンを実装する場合、「dumb」の子がコンストラクターインジェクションを介して「スマート」な親を注入します。親のメンバーが子供に触れてはならないこと、および触れてはいけないことについて意図を伝えることが非常に重要です。それ以外の場合は、親の酒棚で馬鹿な子供が浮気しているのを見つけても驚かないでください。

だから、あなたの質問への私の答え:

以下のように、常にそれらすべてにプライベートを追加する必要がありますか?

強調しないです。常に追加する必要はありません。privateキーワードを追加すると、キーワードの目的が損なわれます。キーワードをどこに置いても意図がわからなくなるためです。どこにも置かない方がよいでしょう。


5
説明ありがとう。しかし、私は間違っているかもしれません。ほとんどの場合、プロパティとメソッドはプライベートである必要があることを理解しています(=「このコンポーネントでのみ使用」)。したがって、答えは「その人がプロパティ/メソッドを外部に公開する必要がない限り、デフォルトでYES」になるはずです。番号 ?「いいえ」(「決して」のように聞こえる)と答えて説明を締めくくるのはなぜですか。
M'sieur Toph '2017

1
私は2つのチュートリアルを修正しましたが、いつpublicを使用するべきかわかりませんでした。コンポーネントの通信には多くのバリアントがあります。angular.io / docs / ts / latest / cookbook / おそらく、入出力を介して定義されたプロパティとメソッドにのみpublicを使用する必要があります。確信はないけど。
Ruslan Borovok

クラスの内部では使用されないが、外部(つまり、テンプレートまたは別のコンポーネントの内部)で使用されるプロパティをコンストラクターで宣言する場合、通常は 'public'を使用する必要があります。
tuliomarchetto

18

@drewmooreは、プライベート/パブリックが意図に要約されるという点で良い答えを提供します。ただし、注入されたプライベート値を使用する場合は、さらにいくつか考慮すべき点があります。

TypeScriptをAoTコンパイルプロセスの出力として出力する場合は、コンポーネントのテンプレートのパブリックフィールドのみにアクセスする必要があります**


最初の点について:これらのエラーは、メンバーがプライベートまたはパブリックであることとは何の関係もありません。それらは単に、メンバーが使用されていないことを示しています。2番目の2つのポイントは、質問がテンプレートでプライベートメンバー参照することに関するものであれば有効ですが、そうではありません。質問についてはこちらをご覧ください
ムーアを描いた2017

@drewmoore、あなたは正しい、そして私は彼らがそれらが使用されていないことを示していることを理解しています。ただし、パブリック変数は外部で使用される可能性があるため、警告がトリガーされることはありません。「コンポーネントで公開されているユースケースはありますか?」という質問自体について、私の2番目と3番目のポイントは、少なくとも公開されているユースケース、具体的にはテンプレートでそれらを使用する場合を示していると思います。 (引用テキストに示されているとおり)。
ルーカス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.