我的超类组件具有一个变量name
。 (受保护的变量)
我想像{{name}}
这样的子类html中访问它。
但是在生产版本上会出现以下错误。
Property 'name' is protected and only accessible within class 'ABCSuperComponent' and its subclasses
当我公开name
变量时,它可以正常工作。但这不是一个好的 OOP 做法。那么有什么解决方案/建议或建议可以解决我的问题吗?
答案 0 :(得分:1)
如果要访问模板中的任何属性,则必须将其声明为public
。否则在生产过程中会失败i。 e ng build --prod
。在开发过程中可能会很好地工作。
ng build --prod
进行aot
编译。因此它应该AOT兼容
答案 1 :(得分:1)
为生产而建造时,angular使用AOT。使用这种类型的构建,必须在模板的组件中将模板中使用的所有变量/方法声明为public。
使用JiT,我们将所有代码转换为ES5,然后在运行时执行绑定。在此过程中,所有可见性修饰符都丢失了,因此,无论您说是公开还是私有都无所谓。
另一方面,使用AoT,我们为模板生成了一些打字稿代码,这些代码将尝试访问这些字段。如果它们是私有的,则它们根本无法访问那些属性,因此,我们必须将它们公开。
这不会更改您在子类中使用该类的任何内容,对于在其模板中使用非公共属性的任何组件,您都会遇到相同的问题
答案 2 :(得分:1)
您可以只公开公开财产而不必担心。
export abstract MyClass {
public name: string;
}
您可以定义受保护的写访问权限的公共读访问权限。
export abstract MyClass {
private _name: string;
public get name(): string {
return _name;
}
protected set name(value:string) {
this._name = value;
}
}
您可以定义读取访问方法
export abstract MyClass {
protected name: string;
public getName(): string {
return this.name;
}
}
答案 3 :(得分:0)
50个可以发表评论的声誉??
我注意到在某些情况下AOT允许访问受保护的属性和方法。
例如
当foo受保护时
<input [required]="foo">
不会在自动生成过程中引起错误
但是
<p>{{foo}}</p>
将导致错误