Angular 6 приватных методов - PullRequest
0 голосов
/ 15 мая 2018

Мы обновляем Angular 6 с 5. У нас есть общая библиотека, в которой мы получаем ошибки сборки. Будучи магазином Java, мы привыкли отмечать методы и атрибуты наших компонентов как частные. В Angular 6 при сборке нашей библиотеки (после конвертации и использования новой возможности CLI библиотеки) мы получаем:

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

Фактически любой атрибут или метод, используемый в шаблоне html, больше не может быть помечен как закрытый для класса компонента. Конечно, мы можем это исправить, удалив модификатор private. Это не имело место в angular 5, когда мы производили нашу библиотеку, используя https://github.com/raphael-volt/ng2-testable-lib.

Как ни странно, это ТОЛЬКО происходит при компиляции нашей библиотеки. Мы обновили приложение до angular 6, в котором также есть личные атрибуты и методы для компонента / использования в шаблоне, и никаких проблем там нет.

Мы нашли ошибку? Есть ли лучшая практика, которой мы не придерживаемся?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

В Angular у нас есть 2 модели компиляции

  • JIT - сборка точно в срок : JIT-компиляция, как следует из названия, компилируетJust-in-Time приложения в браузере во время выполнения.

  • AoT - предварительная компиляция: AoT-компиляция компилирует приложение во время сборки.

По умолчанию при разработке, то есть ng serve, мы получаем JIT-компиляцию.Вот как это работает.Код приложения вместе с угловым компилятором загружается браузером.Во время выполнения, когда к приложению выдается запрос, JIT-компилятор в браузере компилирует код приложения перед его выполнением.

с производственной сборкой, т.е. ng build --prod мы получаем AoT-компиляцию, угловое приложениепрекомпилируются.Таким образом, это означает, что браузер загружает исполняемый код, чтобы он мог визуализировать приложение немедленно, не дожидаясь его первой компиляции.

TypeScript public не имеет значения, но private делает

Из документов Angular Docs
Все data bound свойства должны быть открытыми свойствами TypeScript.Angular никогда не привязывается к частному свойству TypeScript.

На самом деле он связывается со свойствами private, но не в AoT mode

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

С помощью JIT мы конвертируем весь код в ES5, а затем во время выполнения делаемпривязки.Все модификаторы видимости теряются в этом процессе, поэтому не имеет значения, говорите ли вы public или private для этого.

С другой стороны, с помощью AoT мы генерируем некоторый машинописный код для нашегошаблоны, которые будут пытаться получить доступ к этим полям.Если они private, они просто не могут получить доступ к этим свойствам, поэтому вам нужно указать их как public.

0 голосов
/ 15 мая 2018

Свойства, используемые в шаблонах, должны быть открытыми - это связано с компиляцией AoT.

https://angular.io/guide/aot-compiler (найти слово «public» там)

...