Свойство "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
}