我正在尝试为生产构建angular2应用程序,因为我正在关注此blog。在 ngc 成功编译后,当 tsc编译发生时,它会生成以下错误,如图所示:
搜索了一段时间后,我发现这个blog解释了“上下文属性”部分中的问题,我无法正确理解它可能会给出一些好主意发生了什么错误。 基本上当我们将变量设为私有时,我们会得到 “错误:属性是私有的,只能在类” 中访问。我不明白为什么会这样。
请帮助我们,因为我们在过去的几天里一直在讨论这个问题。
答案 0 :(得分:70)
对于给定组件,其模板访问的所有成员(方法,属性)必须在AOT编译方案中公开。这是因为模板被转换为TS类。生成的类和组件现在是2个单独的类,您不能访问跨类的私有成员。
简而言之:如果您想使用提前编译,则无法访问模板中的私有成员。
答案 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向我发送警告邮件之前,我一直忽略了它。