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

我正在尝试为 制作构建 angular2应用程序,因为我正在遵循这个 博客。在我的 Ngc成功编译之后,当 编制发生时,它会产生如下图所示的错误:

经过一段时间的搜索,我发现这个 博客解释的问题,在 “上下文属性”部分,我不能理解正确的可能是它给你一些好主意,什么是发生了错误。 基本上当我们创建一个私有变量时,我们得到的是 < strong > “ ERROR: Property is private and only access inside class” “错误: 属性是私有的,只能在类中访问”

133866 次浏览

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

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

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

所以我解决了这个问题,我就长话短说。为了解决这个问题,我深入阅读了这个 博客。正如在“ 上下文属性”部分,这个问题的解决方案是 不要使用或创建私有变量,如果您想在使用 AOT (< strong > 即,Ahead Of Time )为生产创建构建时直接在视图中使用它。

*for Example *

// 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提供我一些帮助,所以谢谢。

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

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


P.S. when compiling the *.ts code to *.js, AOT refuse to connect non-public members with the 超文本标示语言 template.

“是的”,这将使您的构建管道失败: D

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

constructor(private service: SpecificObjectService) { }

And used them in the template:

*ngFor="let pd of service.listSpecificObject "

解决办法是:

constructor(public service: SpecificObjectService) { }

这对我来说很有用,伙计们: 简单地将服务转换为公共服务。

constructor(public service: SpecificObjectService) { }

应用程序在生产中工作! !

好的,看到了吗,这实际上是一个简单的 javascript es6问题,如果您必须保持数据类型的私有性,您可以简单地这样做

privateAccess(){
return this.cannotAccessByInstanceButStillNeeded
}

如果您想在视图中使用路由器,请将其公开。

例如:

<button
[routerLink]="['/login']"
[queryParams]="{redirectTo: router.url}"
translate="Please sign in to use this feature"
/>
import { Router } from '@angular/router';


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

I overlooked it until Github CI sends me a warning mail.

总是可以在导致此错误的行之前添加 // @ts-ignore。 检查 < a href = “ https://www.typeescriptlang.org/docs/handbook/release-note/typeescript-2-6.html #  禁止-error-in-ts-files-using-ts-annon-comments”rel = “ nofollow norefrer”> Doc

只需删除变量前面的“私有”访问修饰符。如果它是构造函数中声明的实例,那么只需将“ private”更改为“ public”即可。