137 votes

La propriété 'X' est privée et n'est accessible que dans la classe 'xyzComponent'.

J'essaie de construire une application angulaire 2 pour production pour cela, je suis ce qui suit blog . Après mon ngc compilation réussie lorsque le compilation du tsc a lieu, il génère l'erreur ci-dessous montrée dans l'image :

Après avoir cherché pendant un certain temps, j'ai trouvé ceci blog qui explique le problème en "La propriété du contexte" que je n'ai pas réussi à comprendre correctement, cela pourrait vous donner une bonne idée de ce qui ne va pas. En fait, lorsque nous rendons une variable privée, nous obtenons "ERROR : La propriété est privée et n'est accessible que dans la classe" .

2 votes

Avez-vous essayé de faire passer la propriété de privée à publique ?

0 votes

Pouvez-vous s'il vous plaît partager le contenu du fichier ts qui provoque l'erreur ?

170voto

harish gadiya Points 936

Pour un composant donné, tous ses membres (méthodes, propriétés) accessibles par son modèle doivent être publics dans le scénario de compilation AOT. Ceci est dû au fait qu'un template est transformé en une classe TS. Une classe générée et un composant sont maintenant deux classes distinctes et vous ne pouvez pas accéder aux membres privés en croisant les classes.

En bref, vous ne pouvez pas accéder aux membres privés dans vos modèles si vous voulez utiliser la compilation à l'avance.

Pour une meilleure explication https://github.com/angular/angular/issues/11422

2 votes

Mais ce n'était pas le cas des versions antérieures d'Angular, non ? J'ai commencé à obtenir ces erreurs après avoir mis à jour la dernière version.

40voto

Peut-être qu'une autre réponse encore plus simple est :

Les gars, s'il vous plaît, n'appelez pas les méthodes, champs ou propriétés privés depuis le HTML :)


P.S. Lors de la compilation de l *.ts code pour *.js , AOT refuser de mettre en relation des membres non publics avec le HTML modèle.

Et "oui", cela fera échouer votre pipeline de construction :D

1 votes

Ou accéder à des champs/propriétés privés !

0 votes

@Arsen Khachaturyan C'est drôle)

0 votes

@JMK J'ai mis à jour le post en fonction de votre suggestion, merci.

29voto

TiMr Points 699

J'ai obtenu cela lorsque j'ai déclaré des injecteurs privés dans le constructeur :

constructor(private service: SpecificObjectService) { }

Et je les ai utilisés dans le modèle :

*ngFor="let pd of service.listSpecificObject "

La solution est la suivante :

constructor(public service: SpecificObjectService) { }

16voto

Sumit Khanduri Points 969

J'ai donc résolu ce problème. Je vais faire court et simple. Pour résoudre ce problème, j'ai lu ceci blog profondément. Comme dans la section " La propriété contextuelle " La solution à ce problème est la suivante N'utilisez pas ou ne créez pas une variable privée si vous voulez l'utiliser directement dans la vue lorsque vous créez votre build avec AOT ( c'est-à-dire, en avance sur le temps ) pour la production.

*par exemple *

// 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;
    }
  }
}

sortie : La propriété '_initials' est privée et n'est accessible que dans la classe 'ThirdPartyComponent'.

Solution :

_actualiser cette private _initials: string; pour simplement _initials: string;_

Pour cette réponse Harish Gadiya me fournir de l'aide, alors merci pour cela.

0 votes

Pas besoin d'utiliser _name là, ça peut être la même chose que d'utiliser this. et autres name c'est une variable locale this.name=name;

0 votes

@LazerBanana, Mais this.name=name dans le set name est inf. récurrence

0 votes

@vp_arth ? l'un est local, l'autre est global ? même avec le même nom, deux choses différentes, je suppose ? c'est pourquoi tu utilises this. pour pointer vers le global

6voto

Carlos Valdes Points 61

Ça marche pour moi les gars : Il suffit de changer le service en public.

constructor(public service: SpecificObjectService) { }

L'application fonctionne en production !

1 votes

Donc exactement la même solution avec une réponse moins détaillée que la réponse de @TiyebM ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X