2017-03-31 36 views
9

Próbuję utworzyć aplikację kątową2 dla produkcji dla tego śledzę to blog. Po moim NGC udanej kompilacji gdy kompilacja TSC odbywa generuje poniżej błędu pokazanego na obrazku:Właściwość 'X' jest prywatna i dostępna tylko w klasie 'xyzComponent'

enter image description here

Po poszukiwaniach na chwilę znalazłem ten blog która wyjaśnia problemu w „The właściwość kontekstu " sekcja, której nie jestem w stanie zrozumieć właściwie, może być dobrym pomysłem, że to, co się dzieje źle. Zasadniczo, gdy tworzymy zmienną prywatną, otrzymujemy "BŁĄD: Właściwość jest prywatna i dostępna tylko w klasie". Nie rozumiem, dlaczego nadchodzi.

Uprzejmie pomóż nam, ponieważ walczymy z tym problemem przez ostatnie kilka dni.

+0

Czy próbowałeś zmienić nieruchomość z prywatnego na publiczny? –

+0

Czy możesz dzielić zawartość pliku ts, który jest błąd podczas rzucania? –

Odpowiedz

20

Dla danego komponentu wszystkie jego elementy (metody, właściwości) dostępne przez jego szablon muszą być publiczne w scenariuszu kompilacji AOT. Wynika to z faktu, że szablon przekształcony jest w klasę TS. Wygenerowana klasa i komponent są teraz dwiema oddzielnymi klasami i nie można uzyskać dostępu do prywatnych członków o różnych klasach.

Krótko mówiąc: nie możesz uzyskać dostępu do prywatnych członków w szablonach, jeśli chcesz korzystać z kompilacji z wyprzedzeniem.

Dla lepszego wyjaśnieniu https://github.com/angular/angular/issues/11422

2

więc naprawiłem ten problem będę to krótkie i proste. Aby to naprawić, przeczytałem głęboko to: blog. 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żyć w widoku bezpośrednio, gdy twoja kompilacja jest tworzona za pomocą AOT (, tj. Czasu) do produkcji.

* dla przykładu *

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

wyjściowa: '_initials' własność jest prywatna i dostępne tylko w klasie 'ThirdPartyComponent'.

Rozwiązanie:

zmiana ta private _initials: string; po prostu _initials: string;

Dla tej odpowiedzi Harish Gadiya zapewnić mi pomoc tak Dzięki za to.

+0

nie musisz używać "_name" tam, może być takie samo jak ty używając 'this' i inne' name' jest lokalną zmienną 'this.name = name;' – LazerBanana