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心智模型的主要方面之一。
考虑到这一点,显然我们期望组件类的private
variables在其模板中是可见的,因为我们期望它们在该类的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。 公共成员可以从组件类以外的类实例中访问。 但私人成员只能在类成员函数中访问。