Angular 2 预编译器:我必须使所有 class 属性成为 public 吗?

Angular 2 Ahead-of-Time compiler: must I make all class properties public?

Angular 2 rc 6typescript 2node 4.5.0npm 2.15.9 Windows 7

我正在尝试从即时编译转向提前编译,我依赖这些资源:

我知道我需要 运行 编译器 ngc 来生成 ngfactory.ts 文件,并且我需要更改 main.ts 以使用 platformBrowser而不是 platformBrowserDynamic 到 bootstrap。我遇到了障碍,不知道如何继续。

1. 我已经确认应用 运行 使用即时编译没有错误。我的 main.ts 是:

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

2. 我从生产文件夹中清除了所有应用程序文件,但保留了第 3 方库(例如:Angular 2,Angular 2 Material)

3. I 运行 "node_modules/.bin/ngc" -p ./ 这 运行 没有输出到控制台。我看到每个 .ts 组件和模块都有一个 .ngfactory.ts 文件。我还为每个包含组件样式的 .css 看到了一个 .css.shim.ts 文件。此外,.js.js.map 文件已被编译并放置在生产目录

4. 如果此时我尝试 运行 应用程序,我会看到所有 .html 文件的 404 not found 错误持有组件模板

5. 我手动将所有模板文件 (.html) 移动到生产目录和 运行 应用程序。 运行没问题,但它仍然使用即时编译(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 编译是否意味着我必须将所有 class 属性设为 public?我错过了一步吗?

对于给定组件,其模板访问的所有成员(方法、属性)必须在提前编译场景中public。这是因为模板变成了 TS class。一个生成的 class 和一个组件现在是 2 个独立的 classes,你不能跨 class.

访问私有成员

简而言之:如果您想使用提前编译,则不能访问模板中的私有成员。

在 Angular 2 whit Ionic2 RC1 的最终版本中也是如此

Fields 的解决方法是使用没有 setter 的 getter

protected _myField: any;

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

您还可以在 this blog of Isaac Mann

中查看 其他 JiT 到 AoT 的注意事项 以调整您的代码
  1. const lambda => 导出函数
  2. 默认导出 => 命名导出
  3. 对于从模板
  4. 访问的任何成员,应将私有、受保护的访问器更改为public
  5. 动态组件模板 => 静态模板
  6. moduleId 应该在具有 templateUrl 的组件上设置