La propriété 'X' est privée et accessible uniquement dans la classe 'xyzComponent'

97

J'essaie de créer une application angular2 pour la production pour cela, je suis ce blog . Après ma compilation réussie ngc lorsque la compilation tsc a lieu, elle génère l'erreur ci-dessous indiquée dans l'image:

entrez la description de l'image ici

Après avoir cherché pendant un moment, j'ai trouvé ce blog qui explique le problème dans la section "La propriété de contexte" que je ne suis pas capable de comprendre correctement peut-être que cela vous donne une bonne idée de ce qui ne va pas. fondamentalement, lorsque nous rendons une variable privée, nous obtenons "ERREUR: la propriété est privée et accessible uniquement dans la classe" . Je ne comprends pas pourquoi cela arrive.

Veuillez nous aider pendant que nous nous cognons la tête dans ce problème depuis quelques jours.

Sumit Khanduri
la source
1
avez-vous essayé de changer la propriété de privé à public?
Xin Meng
pouvez-vous s'il vous plaît partager le contenu du fichier ts qui lance une erreur?
Rajkishor Sahu

Réponses:

137

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

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

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

harish gadiya
la source
mais ce n'était pas le cas des versions antérieures d'Angular, non? J'ai commencé à recevoir ces erreurs après la mise à niveau vers la dernière version.
batmaci le
35

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

Les gars, veuillez ne pas appeler de méthodes, champs ou propriétés privés à partir du HTML :)


PS lors de la compilation du *.tscode *.js, AOT refuse de connecter les membres non publics avec le modèle HTML .

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

Arsen Khachaturyan
la source
1
Ou accédez aux champs / propriétés privés!
JMK
@Arsen Khachaturyan It`s funny)
voodoo417
@JMK J'ai mis à jour le message en fonction de votre suggestion, merci.
Arsen Khachaturyan le
@ voodoo417, drôle et vrai;). Parfois, une réponse trop académique peut vraiment épater n'importe qui, et nous avons juste besoin d'être aussi simple que possible.
Arsen Khachaturyan le
1
@Arsen Khachaturyan Agree, Arsen +++
voodoo417
16

J'ai donc résolu ce problème, je vais rester court et simple. Pour résoudre ce problème, j'ai lu ce blog en profondeur. Comme dans la section " La propriété de contexte " La solution à ce problème est de ne pas utiliser ou de créer une variable privée si vous souhaitez l'utiliser directement dans la vue lorsque vous créez votre build avec AOT ( ie, Ahead Of Time ) pour 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;
    }
  }
}

output: La propriété '_initials' est privée et accessible uniquement dans la classe 'ThirdPartyComponent'.

Solution:

mettre private _initials: string;à jour ceci simplement_initials: string;

Pour cette réponse, Harish Gadiya m'aide, merci pour cela.

Sumit Khanduri
la source
pas besoin de l'utiliser _namelà-bas, il peut être le même que celui que vous utilisez this.et autre c'est nameune variable localethis.name=name;
LazerBanana
@LazerBanana, mais this.name=namedans le set nameest inf. recursion
vp_arth
@vp_arth? l'un est local, l'autre est global? même avec le même nom 2 choses différentes, je suppose? c'est pourquoi vous utilisez this.pour pointer vers le mondial
LazerBanana
Que voulez-vous dire par local / global? namen'est pas variable, c'est une propriété d'objet. this.name = namedéclenchera setter ( set name(v){}) sur cet objet. Tellement facile de le tester: blitz Maximum call stack size exceeded
vp_arth
16

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

constructor(private service: SpecificObjectService) { }

Et les a utilisés dans le modèle:

*ngFor="let pd of service.listSpecificObject "

La solution est:

constructor(public service: SpecificObjectService) { }
TiyebM
la source
6

Cela fonctionne pour moi les gars: changez simplement le service en public.

constructor(public service: SpecificObjectService) { }

Application en production !!

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

ok voyez c'est vraiment un simple problème javascript es6, si vous devez garder le type de données privé, vous pouvez simplement le faire

privateAccess(){
     return this.cannotAccessByInstanceButStillNeeded
}
MIchael Odumosu
la source
0

Si vous souhaitez utiliser le routeur en vue, veuillez le rendre public.

Par exemple:

<button 
   [routerLink]="['/login']"
   [queryParams]="{redirectTo: router.url}"
   translate="Please sign in to use this feature"
/>
import { Router } from '@angular/router'; 

constructor(
   public router: Router; // don't make it private
) {}

Je l'ai oublié jusqu'à ce que Github CI m'envoie un mail d'avertissement.

bravemaster
la source