属性'X'是私有的,只能在'xyzComponent'类中访问

时间:2017-03-31 13:10:40

标签: angular typescript typescript-typings angular2-aot

我正在尝试为生产构建angular2应用程序,因为我正在关注此blog。在 ngc 成功编译后,当 tsc编译发生时,它会生成以下错误,如图所示:

enter image description here

搜索了一段时间后,我发现这个blog解释了“上下文属性”部分中的问题,我无法正确理解它可能会给出一些好主意发生了什么错误。 基本上当我们将变量设为私有时,我们会得到 “错误:属性是私有的,只能在类” 中访问。我不明白为什么会这样。

请帮助我们,因为我们在过去的几天里一直在讨论这个问题。

7 个答案:

答案 0 :(得分:70)

对于给定组件,其模板访问的所有成员(方法,属性)必须在AOT编译方案中公开。这是因为模板被转换为TS类。生成的类和组件现在是2个单独的类,您不能访问跨类的私有成员。

简而言之:如果您想使用提前编译,则无法访问模板中的私有成员。

为了更好地解释https://github.com/angular/angular/issues/11422

答案 1 :(得分:19)

也许另一个更简单的答案是:

  

伙计们不会从HTML :)中调用私有方法,字段或属性

P.S。在将mysqli_query($MYSQL_CONNECT,$query); 代码编译为*.ts时,AOT拒绝将非公开成员与 HTML 模板相关联。

答案 2 :(得分:9)

所以我解决了这个问题,我会保持简短。为了解决这个问题,我深深地阅读了这个blog。在“上下文属性”部分中,此问题的解决方案是如果要在创建构建时直接在视图中使用它,请不要使用或创建私有变量用于生产的AOT(即,提前)。

*例如*

// component.ts
@Component({
  selector: 'third-party',
  template: `
    {{ _initials }}
  `
})
class ThirdPartyComponent {
  private _initials: string;
  private _name: string;

  @Input()
  set name(name: string) {
    if (name) {
      this._initials = name.split(' ').map(n => n[0]).join('. ') + '.';
      this._name = name;
    }
  }
}

<强>输出: 属性'_initials'是私有的,只能在'ThirdPartyComponent'类中访问。

<强>解决方案:

将此private _initials: string;更新为_initials: string;

对于这个答案,Harish Gadiya为我提供了一些帮助。

答案 3 :(得分:2)

这对我有用:只需将服务更改为公众即可。

constructor(public service: SpecificObjectService) { }

正在生产中的应用程序!

答案 4 :(得分:0)

当我在构造函数中声明私有可注入对象时,我得到了这个:

constructor(private service: SpecificObjectService) { }

并在模板中使用它们:

*ngFor="let pd of service.listSpecificObject "

解决方案是:

constructor(public service: SpecificObjectService) { }

答案 5 :(得分:0)

好吧,这确实是一个简单的javascript es6问题,如果您必须将数据类型设为私有,则只需执行此操作

privateAccess(){
     return this.cannotAccessByInstanceButStillNeeded
}

答案 6 :(得分:0)

如果要在视图中使用路由器,请公开。

例如:

import { Router } from '@angular/router'; 

constructor(
   public router: Router; // don't make it private
) {}
reversedString

在Github CI向我发送警告邮件之前,我一直忽略了它。