Я пытаюсь создать приложение angular2 для производства, для чего я слежу за этим блогом . После моей успешной компиляции ngc, когда происходит компиляция tsc, она генерирует следующую ошибку, показанную на изображении:
После некоторого поиска я нашел этот блог, в котором объясняется проблема в "Свойстве контекста" разделе которое я не могу правильно понять, возможно, он дает вам хорошее представление о том, что происходит не так. в основном, когда мы делаем переменную частной, мы получаем «ОШИБКА: свойство является частным и доступно только внутри класса» . Я не понимаю, почему это происходит.
Пожалуйста, помогите нам, поскольку мы бьемся головой над этой проблемой последние пару дней.
angular
typescript
typescript-typings
angular2-aot
Сумит Хандури
источник
источник
Ответы:
Для данного компонента все его элементы (методы, свойства), к которым обращается его шаблон, должны быть общедоступными в сценарии компиляции AOT. Это связано с тем, что шаблон превращен в класс TS. Сгенерированный класс и компонент теперь являются двумя отдельными классами, и вы не можете получить доступ к частным членам кросс-класса.
Вкратце: вы не можете получить доступ к закрытым членам в своих шаблонах, если хотите использовать предварительную компиляцию.
Для лучшего объяснения https://github.com/angular/angular/issues/11422
источник
Может быть, еще один, еще более простой ответ:
PS при компиляции
*.ts
коды*.js
, АОТ отбросов для подключения непубличных членов с HTML - шаблоном.источник
Я получил это, когда объявил частные инъекции в конструкторе:
constructor(private service: SpecificObjectService) { }
И использовал их в шаблоне:
*ngFor="let pd of service.listSpecificObject "
Решение:
constructor(public service: SpecificObjectService) { }
источник
Итак, я исправил эту проблему, я буду краток и прост. Чтобы исправить это, я внимательно прочитал этот блог . Как и в разделе « Свойство контекста ». Решение этой проблемы состоит в том, что не используйте и не создавайте частную переменную, если вы хотите использовать ее непосредственно в представлении, когда вы создаете свою сборку с 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;
Для этого ответа Хариш Гадия оказал мне некоторую помощь, поэтому спасибо за это.
источник
_name
там, это может быть то же самое, что и вы,this.
и другаяname
его локальная переменнаяthis.name=name;
this.name=name
вset name
инф. рекурсияthis.
чтобы указать на глобальныйname
не является переменной, это свойство объекта.this.name = name
вызовет setter (set name(v){}
) для этого объекта. Это так легко проверить: blitzMaximum call stack size exceeded
Это работает для меня, ребята: просто измените сервис на публичный.
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 ) {}
Я пропустил это, пока Github CI не пришлет мне письмо с предупреждением.
источник