Angular2 – 应该在模板中访问私有variables?

如果一个variables在组件类上声明为private ,我应该能够在该组件的模板中访问它吗?

 @Component({ selector: 'my-app', template: ` <div> <h2>{{title}}</h2> <h2>Hello {{userName}}</h2> // I am getting this name </div> `, }) export class App { public title = 'Angular 2'; private userName = "Test Name"; //declared as private } 

编辑:这个答案现在是不正确的。 当我发布这个主题时,没有官方的指导,但正如@ Yaroslov(优秀的,正确的)答案中所解释的那样:Codelizer现在发出警告,并且AoT编译将会在引用组件模板中的私有variables时失败。 也就是说,在概念层面上,这里的一切都是有效的,所以我会留下这个答案,因为它似乎有帮助。


是的,这是预料之中的。

请记住, private和其他访问修饰符是Typescript构造,而组件/控制器/模板是Typescript一无所知的angular度构造。 访问修饰符控制类之间的可见 :使字段private可以防止其他类访问它,但模板和控制器是类中存在的东西。

这在技术上不是真实的,但是(代替了解类与装饰器及其元数据的关系),以这种方式来思考它可能是有帮助的,因为重要的事情(恕我直言)是将模板和控制器分开思考实体把它们想成是Component构造的统一部分 – 这是ng2心智模型的主要方面之一。

考虑到这一点,显然我们期望组件类的privatevariables在其模板中是可见的,因为我们期望它们在该类的private方法中可见。

不,你不应该在你的模板中使用私有variables。

虽然我喜欢drewmoore的回答,并且看到了完美的概念逻辑,但实际上这是错误的。 模板在组件类中不存在,但不在其中。 看看这个回购certificate。

它工作的唯一原因是因为TypeScript的private关键字并不真正使会员私人。 即时编译发生在运行时浏览器和JS没有任何私人成员的概念(?)。 值得信赖桑德埃利亚斯把我放在正确的轨道上。

使用ngc和Ahead-of-Time编译,如果您尝试从模板访问组件的私有成员,将会出错。 克隆演示回购,将MyComponent成员的可见性更改为私有,并且在运行ngc时会出现编译错误。 这也是针对前期编译的具体答案 。

尽pipe代码示例指出了关于TypeScript的问题,但它没有打印脚本标记。 Angular2也可用于Dart,这与Dart有着显着的区别。

Dart中模板不能引用组件类的私有variables ,因为与Dart相比,TypeScript有效地阻止了外部私有成员的访问。

我仍然支持@drewmooresbuild议思考组件和它的模板作为一个单位,虽然。

更新(TS)似乎脱机编译访问私有属性将变得更加有限的Angular2 TS以及https://github.com/angular/angular/issues/11422

私有variables可以在组件的模板中使用。 请参阅angular2作弊指南: https ://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-child-setter

打字稿中公共/私人成员的详细解释可以在这里find: https : //www.typescriptlang.org/docs/handbook/classes.html 。

所有成员默认为Public。 公共成员可以从组件类以外的类实例中访问。 但私人成员只能在类成员函数中访问。