variable - Compilador anticipado de Angular 2: ¿debo hacer públicas todas las propiedades de la clase?
change title angular 4 (2)
Así es también, en la versión final de Angular 2 con Ionic2 RC1
Una solución para Fields podría ser utilizar getters sin setters.
protected _myField: any;
get myField(): any {
return this._myField;
}
También puede ver otras consideraciones de JiT a AoT para adaptar su código en este blog de Isaac Mann
- const lambda => exportar función
- exportación predeterminada => exportación con nombre
- Los accesores privados y protegidos deben cambiarse a público para cualquier miembro al que se acceda desde la plantilla
- plantilla de componente dinámico => plantilla estática
- moduleId debe establecerse en componentes con templateUrl
Angular 2 rc 6
, typescript 2
, node 4.5.0
npm 2.15.9
, npm 2.15.9
en Windows 7
Estoy tratando de pasar de la compilación Justo a Tiempo a Adelantado del Tiempo y confío en estos recursos:
- Angular 2: compilación anticipada de cómo
- https://github.com/angular/angular/tree/master/modules/@angular/compiler-cli#angular-template-compiler
Entiendo que necesito ejecutar el compilador ngc
para generar archivos ngfactory.ts
, y que necesito cambiar main.ts
para usar platformBrowser
lugar de platformBrowserDynamic
para bootstrap. Sin embargo, he golpeado un obstáculo y no sé cómo proceder.
1. He confirmado que la aplicación se ejecuta sin errores utilizando la compilación Just-in-Time. Mi main.ts
es:
enableProdMode();
platformBrowserDynamic().bootstrapModule(AppModule);
2. Borro todos los archivos de mi aplicación de mi carpeta de producción, pero conservo bibliotecas de terceros (por ejemplo: Angular 2, Angular 2 Material)
3. "node_modules/.bin/ngc" -p ./
Esto se ejecuta sin salida a la consola. Veo un archivo .ngfactory.ts
para cada uno de mis componentes y módulos .ts
. También veo un archivo .css.shim.ts
para cada uno de mis .css
que contenía estilos de componentes. Además, los archivos .js
y .js.map
se han transpilado y colocado en el directorio de producción
4. Si intento ejecutar la aplicación en este momento, veo errores 404 not found
para todos los archivos .html
que contenían plantillas de componentes
5. Muevo manualmente todos los archivos de plantilla ( .html
) al directorio de producción y ejecuto la aplicación. Funciona bien, pero aún usa la compilación Just-in-Time (255 solicitudes, incluido compiler.umd.js
)
6. Cambio mis main.ts
a:
enableProdMode();
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory);
Por sí solo, esto no hace ninguna diferencia ya que el nuevo código no ha sido compilado. Sin embargo, no sé qué hacer desde aquí.
¿Debo ejecutar ngc
nuevo? Si es así recibo muchos errores del tipo:
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
¿El hecho de usar la compilación de AoT significa que debo hacer públicas todas las propiedades de mi clase? ¿Me estoy perdiendo un paso?
Para un componente dado, todos sus miembros (métodos, propiedades) a los que accede su plantilla deben ser públicos en el escenario de compilación anticipada. Esto se debe al hecho de que una plantilla se convierte en una clase TS. Una clase generada y un componente ahora son 2 clases separadas y no puede acceder a miembros privados de clases cruzadas.
En resumen: no puede acceder a miembros privados en sus plantillas si desea utilizar una compilación anticipada.