web-dev-qa-db-ja.com

プロパティ「X」はプライベートであり、クラス「xyzComponent」内でのみアクセス可能

私はこれをフォローしているため、productionのためにangular2アプリケーションを構築しようとしています blogngcが正常にコンパイルされた後、tsc compilationが実行されると、以下が生成されます画像に示されているエラー:

enter image description here

しばらく探した後、私はこれを見つけました ブログ これは「コンテキストプロパティ」セクションで問題を説明します適切に理解できると、何が間違っているのかという良いアイデアが得られるかもしれません。基本的に変数をプライベートにすると、 "エラー:プロパティはプライベートで、クラス内でのみアクセス可能"。なぜそれが来るのか理解できません。

過去数日間、この問題で頭を痛めているので、ご協力ください。

61
Sumit Khanduri

特定のコンポーネントについて、そのテンプレートによってアクセスされるすべてのメンバー(メソッド、プロパティ)は、AOTコンパイルシナリオでパブリックでなければなりません。これは、テンプレートがTSクラスに変換されるという事実によるものです。生成されたクラスとコンポーネントは2つの別個のクラスになり、クラスを越えてプライベートメンバーにアクセスすることはできません。

つまり、事前コンパイルを使用する場合、テンプレート内のプライベートメンバーにアクセスできません。

より良い説明のため https://github.com/angular/angular/issues/11422

87
harish gadiya

別のもっと簡単な答えは:

GuysはHTMLからプライベートメソッド、フィールド、またはプロパティを呼び出しません。


追伸*.tsコードを*.jsにコンパイルするとき、 AOT 非パブリックメンバーとHTMLテンプレート。

23

この問題を修正したので、これを短くシンプルに保ちます。これを修正するには、これを blog 深く読みます。セクション「The context property」のように、この問題の解決策は、プライベート変数を使用または作成しないことです。生産のためにAOT(ie、Ahead Of Time)を使用してビルドを作成するときに、ビューで直接使用する必要があります。

*例*

// component.ts
@Component({
  selector: 'third-party',
  template: `
    {{ _initials }}
  `
})
class ThirdPartyComponent {
  private _initials: string;
  private _name: string;

  @Input()
  set name(name: string) {
    if (name) {
      this._initials = name.split(' ').map(n => n[0]).join('. ') + '.';
      this._name = name;
    }
  }
}

output:プロパティ「_initials」はプライベートであり、クラス「ThirdPartyComponent」内でのみアクセス可能です。

解決策:

このprivate _initials: string;を単に_initials: string;に更新します

この答えについて Harish Gadiya 助けてくれてありがとう。

11
Sumit Khanduri

私はコンストラクタでプライベートな注入可能を宣言したときにこれを得ました:

constructor(private service: SpecificObjectService) { }

そしてテンプレートでそれらを使用しました:

*ngFor="let pd of service.listSpecificObject "

解決策は次のとおりです。

constructor(public service: SpecificObjectService) { }
3
TiyebM

これは私にとっては有効です。サービスを一般に変更するだけです。

constructor(public service: SpecificObjectService) { }

実稼働中のアプリ!!

0
Carlos Valdes