【问题标题】:Property 'X' is private and only accessible within class 'xyzComponent'属性“X”是私有的,只能在类“xyzComponent”中访问
【发布时间】:2017-08-25 18:40:45
【问题描述】:

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

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

请帮助我们,因为我们在过去几天一直在努力解决这个问题。

【问题讨论】:

  • 您是否尝试过将属性从私有更改为公共?
  • 你能分享一下抛出错误的ts文件内容吗?

标签: angular typescript typescript-typings angular2-aot


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您始终可以在导致此错误的行之前添加// @ts-ignore。 检查Doc

    【讨论】:

      【解决方案3】:

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

      例如:

      <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
      ) {}
      

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

      【讨论】:

        【解决方案4】:

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

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


        附:在将*.ts 代码编译为*.js 时,AOT 拒绝使用 HTML 模板连接非公共成员。

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

        【讨论】:

        • 或访问私有字段/属性!
        • @Arsen Khachaturyan 这很有趣)
        • @JMK 我已经根据你的建议更新了帖子,谢谢。
        • @Arsen Khachaturyan 同意,Arsen+++
        • @Tanzeel,私有/公共属性的情况可能只是构建失败的原因之一。首先要做的是了解错误消息告诉您的内容。然后了解错误发生在哪里(什么页面、服务、指令等),或者可能是由于其他原因(配置问题等)而发生的。定位问题后,尝试检查上述解决方案是否可以应用。我希望这会有所帮助。
        【解决方案5】:

        好的,这确实是一个简单的 javascript es6 问题,如果您必须保持数据类型为私有,您可以这样做

        privateAccess(){
             return this.cannotAccessByInstanceButStillNeeded
        }
        

        【讨论】:

          【解决方案6】:

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

          constructor(public service: SpecificObjectService) { }
          

          应用正在生产中!!

          【讨论】:

          • 所以与上面@TiyebM 的答案完全相同的解决方案,但答案不太详细。
          【解决方案7】:

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

          constructor(private service: SpecificObjectService) { }
          

          并在模板中使用它们:

          *ngFor="let pd of service.listSpecificObject "
          

          解决办法是:

          constructor(public service: SpecificObjectService) { }
          

          【讨论】:

            【解决方案8】:

            所以我解决了这个问题,我会保持简短。为了解决这个问题,我深入阅读了这个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 为我提供一些帮助,谢谢。

            【讨论】:

            • 那里不需要使用_name,它可以和你使用this.和其他name一样,它是一个局部变量this.name=name;
            • @LazerBanana,但是set name 中的this.name=name 是inf。递归
            • @vp_arth ?一种是本地的,一种是全球的?即使同名2个不同的东西,我猜?这就是为什么你使用this. 指向全局的原因
            • 本地/全局下是什么意思? name 不是变量,它是对象属性。 this.name = name 将在该对象上触发 setter(set name(v){})。很容易测试它:blitzMaximum call stack size exceeded
            【解决方案9】:

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

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

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

            【讨论】:

            • 但这不是 Angular 早期版本的情况,不是吗?升级到最新版本后,我开始收到这些错误。
            猜你喜欢
            • 2016-12-14
            • 2017-02-23
            • 2017-08-27
            • 2021-01-10
            • 2019-06-17
            • 2018-01-01
            • 2019-06-19
            相关资源
            最近更新 更多