Свойство "X" является закрытым и доступно только в классе "xyzComponent"

Я пытаюсь создать приложение angular2 для production, потому что я следую этому blog. После успешной компиляции ngc, когда происходит компиляция tsc, она генерирует ниже ошибки, показанной на изображении:

введите описание изображения здесь

После некоторого поиска я нашел этот blog, который объясняет проблему в "Свойство контекста" раздел, который я не могу понять правильно, может быть, это дает вам некоторую полезную мысль о том, что происходит неправильно. в основном, когда мы создаем переменную private, мы получаем "ERROR: свойство является закрытым и доступно только в классе. Я не понимаю, почему это происходит.

Просьба помочь нам, поскольку мы стучим головой в эту проблему за последние пару дней.

Ответ 1

Для данного компонента все его члены (методы, свойства), к которым обращается его шаблон, должны быть общедоступными в сценарии компиляции AOT. Это связано с тем, что шаблон превращается в класс TS. Сгенерированный класс и компонент теперь являются 2 отдельными классами, и вы не можете получить доступ к закрытым членам кросс-класса.

Вкратце: вы не можете получить доступ к частным членам в своих шаблонах, если хотите использовать компиляцию в режиме времени.

Для лучшего объяснения https://github.com/angular/angular/issues/11422

Ответ 2

Может быть, еще один более простой ответ:

Парни не вызывают частные методы, поля или свойства из HTML :)


PS при компиляции кода *.ts в *.js AOT отказывается подключать непубличных участников с помощью шаблона HTML.

Ответ 3

Так что я исправил эту проблему, я буду кратким и простым. Чтобы исправить это, я прочитал этот блог глубоко. Как и в разделе " Свойство контекста ". Решение этой проблемы заключается в том, что не используйте и не создавайте закрытую переменную, если вы хотите использовать ее в представлении непосредственно при создании сборки с помощью AOT (т.е. Ahead Of Time) для производство.

*например *

// 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;

За этот ответ Хариш Гадия оказал мне некоторую помощь, спасибо за это.

Ответ 4

Я получил это, когда объявил приватные инъекции в конструкторе:

constructor(private service: SpecificObjectService) { }

И использовал их в шаблоне:

*ngFor="let pd of service.listSpecificObject "

Решение:

constructor(public service: SpecificObjectService) { }

Ответ 5

Это работает для меня, ребята: просто поменяйте сервис на публичный.

constructor(public service: SpecificObjectService) { }

Приложение работает в производстве!

Ответ 6

хорошо, видите, это действительно простая проблема javascript es6, если вы хотите сохранить тип данных закрытым, вы можете просто сделать это

privateAccess(){
     return this.cannotAccessByInstanceButStillNeeded
}