Próbuję zbudować aplikację angular2 do produkcji, śledzę tego bloga . Po udanej kompilacji ngc, gdy ma miejsce kompilacja tsc , generuje poniższy błąd pokazany na obrazku:
Po dłuższych poszukiwaniach znalazłem tego bloga, który wyjaśnia problem w sekcji „Właściwość kontekstu”, którego nie jestem w stanie poprawnie zrozumieć, może to dobry pomysł, że to co się dzieje nie tak. w zasadzie kiedy ustawiamy zmienną jako prywatną, otrzymujemy "BŁĄD: Właściwość jest prywatna i dostępna tylko w klasie" . Nie rozumiem, dlaczego to nadchodzi.
Prosimy o pomoc, bo przez ostatnie kilka dni waliliśmy się w głowę z tym problemem.
angular
typescript
typescript-typings
angular2-aot
Sumit Khanduri
źródło
źródło
Odpowiedzi:
Dla danego składnika wszystkie jego elementy członkowskie (metody, właściwości), do których ma dostęp jego szablon, muszą być publiczne w scenariuszu kompilacji AOT. Wynika to z faktu, że szablon jest przekształcany w klasę TS. Wygenerowana klasa i komponent są teraz dwiema oddzielnymi klasami i nie możesz uzyskać dostępu do prywatnych elementów członkowskich między klasami.
Krótko mówiąc: nie możesz uzyskać dostępu do prywatnych członków w swoich szablonach, jeśli chcesz użyć kompilacji z wyprzedzeniem.
Dla lepszego wyjaśnienia https://github.com/angular/angular/issues/11422
źródło
Być może inną, jeszcze prostszą odpowiedzią jest:
PS podczas kompilowania
*.ts
kodu do*.js
, AOT odmawia połączenia niepublicznych członków z szablonem HTML .źródło
Otrzymałem to, gdy zadeklarowałem prywatne iniekcje w konstruktorze:
constructor(private service: SpecificObjectService) { }
I użyłem ich w szablonie:
*ngFor="let pd of service.listSpecificObject "
Rozwiązaniem jest:
constructor(public service: SpecificObjectService) { }
źródło
Więc naprawiłem ten problem, pozostawiam to krótkie i proste. Aby to naprawić, głęboko przeczytałem tego bloga . Jak w sekcji „ Właściwość kontekstu ” Rozwiązanie tego problemu polega na tym, że nie używaj ani nie twórz zmiennej prywatnej, jeśli chcesz jej używać bezpośrednio w widoku podczas tworzenia kompilacji z AOT ( tj. Ahead Of Time ) dla produkcja.
*na przykład *
// 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; } } }
dane wyjściowe: Właściwość „_initials” jest prywatna i dostępna tylko w klasie „ThirdPartyComponent”.
Rozwiązanie:
zaktualizuj to
private _initials: string;
po prostu_initials: string;
W tej odpowiedzi Harish Gadiya zapewni mi pomoc, a dzięki temu.
źródło
_name
tam używać , może być taki sam, jak używany,this.
a innaname
jego zmienna lokalnathis.name=name;
this.name=name
wset name
jest inf. rekurencjathis.
name
nie jest zmienną, jest własnością obiektu.this.name = name
wywoła setter (set name(v){}
) na tym obiekcie. Tak łatwo to przetestować: blitzMaximum call stack size exceeded
Dla mnie to działa: po prostu zmień usługę na publiczną.
constructor(public service: SpecificObjectService) { }
Aplikacja działa w produkcji !!
źródło
ok zobacz, to naprawdę prosty problem z javascriptem es6, jeśli musisz zachować prywatność typu danych, możesz po prostu to zrobić
privateAccess(){ return this.cannotAccessByInstanceButStillNeeded }
źródło
Jeśli chcesz używać routera w widoku, upublicznij go.
Na przykład:
<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 ) {}
Przeoczyłem to, dopóki Github CI nie wyśle mi ostrzeżenia.
źródło