为了账号安全,请及时绑定邮箱和手机立即绑定

Angular2-可以在模板中访问私有变量吗?

/ 猿问

Angular2-可以在模板中访问私有变量吗?

慕妹3242003 2019-12-25 15:31:25

如果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

}


查看完整描述

3 回答

?
守着一只汪

不,您不应该在模板中使用私有变量。


虽然我喜欢drewmoore的答案,并且看到了完美的概念逻辑,但在实现上却是错误的。模板不存在于组件类中,而是在它们之外。查看此回购作为证明。


它起作用的唯一原因是因为TypeScript的private关键字并未真正使成员私有。即时编译在运行时在浏览器中进行,并且JS没有任何私有成员的概念(还可以吗?)。幸得桑德埃利亚斯为把我在正确的轨道上。


使用ngc和提前编译,如果尝试从模板访问组件的私有成员,则会出现错误。克隆演示仓库,将MyComponent成员的可见性更改为private,运行时将出现编译错误ngc。这也是提前编译的特定答案。


查看完整回答
反对 回复 2019-12-25
?
潇湘沐

我在发布该主题时没有官方指导,但正如@Yaroslov的(出色而正确的)答案中所述,现在不再是这种情况:Codelizer现在发出警告,并且在组件模板中引用私有变量时AoT编译将失败。就是说,从概念上讲,这里的所有内容仍然有效,因此我将保留这个答案,因为它似乎很有帮助。


是的,这是预期的。


请记住,private和其他访问修饰符是Typescript构造,而Component / controller / template是Typescript一无所知的角度构造。访问修饰符控制类之间的可见性:创建字段private可防止其他类访问它,但是模板和控制器是类内存在的东西。


从技术上讲,这不是正确的,但是(代替理解类与装饰器及其元数据的关系)可能会有所帮助,因为重要的是(IMHO)不再将模板和控制器视为独立实体将其视为Component构造的统一部分-这是ng2心理模型的主要方面之一。


以这种方式思考,显然,我们希望private组件类中的变量在其模板中可见,出于同样的原因,我们希望它们在private该类的方法中可见。


查看完整回答
反对 回复 2019-12-25
?
萧十郎

即使代码示例表明问题是关于TypeScript的,也没有typescript标记。Angular2也可用于Dart,这与Dart有显着差异。


在Dart中,模板无法引用组件类的私有变量,因为与TypeScript相比,Dart有效地防止了从外部访问私有成员。


我仍然支持@drewmoores关于将组件及其模板作为一个单元来考虑的建议。


更新(TS) 似乎通过离线编译对私有属性的访问也会在Angular2 TS中受到更大的限制https://github.com/angular/angular/issues/11422


查看完整回答
反对 回复 2019-12-25

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信