角子类模板访问超类中定义的变量

时间:2018-08-02 13:41:54

标签: angular typescript oop

我的超类组件具有一个变量name(受保护的变量)

我想像{{name}}这样的子类html中访问它。 但是在生产版本上会出现以下错误。

Property 'name' is protected and only accessible within class 'ABCSuperComponent' and its subclasses

当我公开name变量时,它可以正常工作。但这不是一个好的 OOP 做法。那么有什么解决方案/建议或建议可以解决我的问题吗?

4 个答案:

答案 0 :(得分:1)

如果要访问模板中的任何属性,则必须将其声明为public。否则在生产过程中会失败i。 e ng build --prod。在开发过程中可能会很好地工作。

ng build --prod进行aot编译。因此它应该AOT兼容

答案 1 :(得分:1)

为生产而建造时,angular使用AOT。使用这种类型的构建,必须在模板的组件中将模板中使用的所有变量/方法声明为public。

来自(API reference docs

  

使用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>将导致错误

相关问题