Property 'X' is private and only accessible within class 'xyzComponent'

前端 未结 7 1216
逝去的感伤
逝去的感伤 2020-12-07 13:48

I\'m trying to build angular2 application for production for that I\'m following this blog. After my ngc successful compilation when the

相关标签:
7条回答
  • 2020-12-07 14:10

    Maybe another even simpler answer is:

    Guys, please don't call private methods, fields or properties from the HTML :)


    P.S. when compiling the *.ts code to *.js, AOT refuse to connect non-public members with the HTML template.

    And "yes" this will make your build pipeline to fail :D

    0 讨论(0)
  • 2020-12-07 14:13

    ok see this is really a simple javascript es6 problem, if you must keep the data type private you can simply do this

    privateAccess(){
         return this.cannotAccessByInstanceButStillNeeded
    }
    
    0 讨论(0)
  • 2020-12-07 14:18

    This works for me guys: Simply change service to public.

    constructor(public service: SpecificObjectService) { }
    

    App working in production!!

    0 讨论(0)
  • 2020-12-07 14:19

    I got this when I declared private injectables in the constructor:

    constructor(private service: SpecificObjectService) { }
    

    And used them in the template:

    *ngFor="let pd of service.listSpecificObject "
    

    The solution is:

    constructor(public service: SpecificObjectService) { }
    
    0 讨论(0)
  • 2020-12-07 14:22

    For a given component all its members (methods, properties) accessed by its template must be public in the AOT compilation scenario. This is due to the fact that a template is turned into a TS class. A generated class and a component are 2 separate classes now and you can't access private members cross-class.

    In short: you can't access private members in your templates if you want to use ahead-of-time compilation.

    For better explaination https://github.com/angular/angular/issues/11422

    0 讨论(0)
  • 2020-12-07 14:23

    So I fixed this problem I'll keep this short and simple. To fix this I read this blog deeply. As in section "The context property" The solution for this problem is that Don't use or create a private variable if you want to use it in the view directly when your are creating your build with AOT (i.e., Ahead Of Time) for production.

    *for Example *

    // 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: Property '_initials' is private and only accessible within class 'ThirdPartyComponent'.

    Solution:

    update this private _initials: string; to simply _initials: string;

    For this answer Harish Gadiya provide me some help so thanx for that.

    0 讨论(0)
提交回复
热议问题