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

问题描述 投票:44回答:4

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

enter image description here

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

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

angular typescript typescript-typings angular2-aot
4个回答
83
投票

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

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

为了更好地解释qazxsw poi


23
投票

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

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


附:在将https://github.com/angular/angular/issues/11422代码编译为*.ts时,*.js拒绝将非公共成员与HTML模板连接起来。


11
投票

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

*例如 *

blog

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

解:

将此// 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; } } } 更新为简单的private _initials: string;

对于这个答案,qazxsw poi为我提供了一些帮助,所以感谢你。


3
投票

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

_initials: string;

并在模板中使用它们:

Harish Gadiya

解决方案是:

constructor(private service: SpecificObjectService) { }
© www.soinside.com 2019 - 2024. All rights reserved.