web-dev-qa-db-fra.com

Angular 6 méthodes privées

Nous passons à Angular 6 à partir de 5. Nous avons une bibliothèque partagée dans laquelle nous obtenons des erreurs de génération. En tant que boutique Java, nous avons pris l’habitude de marquer nos méthodes de composant et leurs attributs comme confidentiels. Dans Angular 6 lors de la construction de notre bibliothèque (après conversion et utilisation de la nouvelle fonctionnalité CLI de la bibliothèque), nous obtenons:

Property 'getCurrentYear' is private and only accessible within class.

En effet, tout attribut ou méthode utilisé dans un template html ne peut plus être marqué comme privé sur la classe de composant. Bien sûr, nous pouvons résoudre ce problème en supprimant le modificateur 'private'. Ce n’était pas le cas dans angular 5 lorsque nous avons créé notre bibliothèque avec https://github.com/raphael-volt/ng2-testable-lib .

Curieusement, cela ne se produit que lors de la compilation de notre bibliothèque. Nous avons mis à niveau une application vers angular 6 qui possède également des attributs et des méthodes privés sur le composant/l'utilisation dans le modèle et ne pose aucun problème.

Avons-nous trouvé un bug? Existe-t-il une meilleure pratique à laquelle nous n'adhérons pas?

7
Scott

En Angular nous avons 2 modèles de compilation

  • JIT - Compilation Just-in-Time : La compilation JIT, comme son nom l'indique, compile l'application Just-in-Time dans le navigateur à l'exécution de .

  • AoT - Compilation à l’avance: La compilation AoT compile l’application au moment de la construction.

Par défaut, avec la version de développement i.e ng serve, nous obtenons la compilation JIT. Voilà comment cela fonctionne. Le code de l'application et le compilateur angulaire sont téléchargés par le navigateur. Au moment de l'exécution, lorsqu'une demande est émise vers l'application, le compilateur JIT du navigateur compile le code de l'application avant son exécution.

avec la version de production, i.e ng build --prod, nous obtenons une compilation AoT, l'application angulaire est pré-compilée. Cela signifie donc que le navigateur charge le code exécutable afin de pouvoir rendre l'application immédiatement, sans attendre de la compiler au préalable.

Le typeScript public n'a pas d'importance mais private le fait

De Angular Docs
Toutes les propriétésdata bounddoivent être des propriétés TypeScript publiques . Angular ne se lie jamais à une propriété privée TypeScript.

en fait, il est lié aux propriétés private, mais pas dans AoT mode

Why AOT Compiler requires public properties, while non-AOT allows private properties?

Avec JIT, nous convertissons tout le code en ES5 puis, au moment de l'exécution, nous effectuons les liaisons. Tous les modificateurs de visibilité sont perdus dans ce processus, donc peu importe si vous dites public ou private pour cela.

D'autre part, avec AoT, nous générons du code TypeScript pour nos modèles, qui tentera d'accéder à ces champs. S'ils sont private, ils ne peuvent tout simplement pas accéder à ces propriétés; vous devez donc les définir sous la forme public.

20
Vikas

Les propriétés utilisées dans les modèles doivent être publiques - ceci est lié à la compilation AoT.

https://angular.io/guide/aot-compiler (trouve le mot "public" ici)

2