Подтвердить что ты не робот

Angular 2 Компилятор Ahead of the Time: должен ли я публиковать все свойства класса?

Angular 2 rc 6, typescript 2, node 4.5.0, npm 2.15.9 на Windows 7

Я пытаюсь перейти от компиляции Just-in-Time to Ahead-of-Time, и я полагаюсь на эти ресурсы:

Я понимаю, что мне нужно запустить компилятор ngc для генерации ngfactory.ts файлов, и что мне нужно изменить main.ts, чтобы использовать platformBrowser вместо platformBrowserDynamic для начальной загрузки. Я ударил блокпост хотя и не знаю, как продолжить.

1. Я подтвердил, что приложение работает без ошибок с использованием компиляции Just-in-Time. Мой main.ts:

enableProdMode();
platformBrowserDynamic().bootstrapModule(AppModule);

2. Я удаляю все мои файлы приложений из своей производственной папки, но сохраняю сторонние библиотеки (например: Angular 2, Angular 2 Материал)

3. Я запускаю "node_modules/.bin/ngc" -p ./ Это выполняется без вывода на консоль. Я вижу файл .ngfactory.ts для каждого из моих компонентов и модулей .ts. Я также вижу файл .css.shim.ts для каждого из моих .css, которые содержат стили компонентов. Кроме того, файлы .js и .js.map были переписаны и помещены в производственный каталог

4. Если я попытаюсь запустить приложение в этот момент, я вижу ошибки 404 not found для всех файлов .html, содержащих шаблоны компонентов

5. Я вручную перемещаю все файлы шаблонов (.html) в производственный каталог и запускаю приложение. Он работает нормально, но он по-прежнему использует компиляцию Just-in-Time (255 запросов, включая compiler.umd.js)

6. Я меняю свой main.ts на:

enableProdMode();
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);

Само по себе это не имеет значения, поскольку новый код не был скомпилирован. Однако я не знаю, что делать дальше.

Должен ли я снова запустить ngc? Если это так, я получаю много ошибок типа:

Error at C:/path/to/notify.component.ngfactory.ts:113:41: Property 'visible' is private and only accessible within class 'NotifyComponent'
... (many more like that with lots of properties from lots of components)
Compilation failed

Использует ли использование компиляции AoT, что я должен сделать все мои свойства класса общедоступными? Мне не хватает шага?

4b9b3361

Ответ 1

Для данного компонента все его элементы (методы, свойства), к которым обращается его шаблон , должны быть общедоступными в сценарии компиляции с опережением времени. Это связано с тем, что шаблон превращается в класс TS. Сгенерированный класс и компонент теперь являются 2 отдельными классами, и вы не можете получить доступ к закрытым членам кросс-класса.

Вкратце: вы не можете получить доступ к частным членам в своих шаблонах, если хотите использовать компиляцию в режиме времени.

Ответ 2

Так же, в финальной версии Angular 2 whit Ionic2 RC1

Обходной путь для полей может заключаться в использовании геттеров без сеттеров

protected _myField: any;

get myField(): any { 
  return this._myField; 
}

Вы также можете увидеть другие соображения JiT для AoT, чтобы адаптировать ваш код в этот блог Айзека Манна

  • const lambda = > функция экспорта
  • default export = > named export
  • личные, защищенные accessors должны быть изменены для публики для всех участников, обращающихся из шаблона
  • шаблон динамического компонента = > статический шаблон
  • moduleId должен быть установлен на компонентах с templateUrl