Angular2 - czy zmienne prywatne powinny być dostępne w szablonie?
Jeśli zmienna jest zadeklarowana private
na klasie komponentu, czy powinienem mieć do niej dostęp w szablonie tego komponentu?
@Component({
selector: 'my-app',
template: `
<div>
<h2>{{title}}</h2>
<h2>Hello {{userName}}</h2> // I am getting this name
</div>
`,
})
export class App {
public title = 'Angular 2';
private userName = "Test Name"; //declared as private
}
5 answers
Edit: ta odpowiedź jest teraz Niepoprawna. nie było oficjalnych wskazówek na ten temat, kiedy go opublikowałem, ale jak wyjaśniono w (doskonałej i poprawnej) odpowiedzi @Yaroslov, tak już nie jest: Codelizer ostrzega teraz, a kompilacja AoT zawiedzie w odniesieniu do prywatnych zmiennych w szablonach komponentów. To powiedziawszy, na poziomie koncepcyjnym wszystko tutaj pozostaje aktualne, więc zostawię tę odpowiedź, ponieważ wydaje się, że była pomocna.
Tak, to jest oczekiwane.
Należy pamiętać, że private
i inne modyfikatory dostępu są konstrukcjami Typescript, podczas gdy komponent/kontroler/szablon są konstrukcjami kątowymi, o których Typescript nic nie wie. Modyfikatory dostępu kontrolują widoczność pomiędzy klasami: tworzenie pola private
uniemożliwia innym klasom dostęp do niego, ale szablony i kontrolery to rzeczy, które istnieją wewnątrz klas.
To nie jest technicznie prawda, ale (zamiast zrozumienia, jak klasy odnoszą się do dekoratorów i ich metadanych), przydałoby się pomyśleć o tym w ten sposób, bo najważniejsze (IMHO) jest przejście od myślenia o szablonie i kontrolerze jako osobnych bytach do myślenia o nich jako o zunifikowanych częściach konstrukcji komponentowej - to jeden z głównych aspektów mentalnego modelu ng2.
Myśląc o tym w ten sposób, oczywiście oczekujemy, że private
zmienne NA klasie komponentu będą widoczne w jej szablonie, z tego samego powodu oczekujemy, że będą być widoczne w metodach private
w tej klasie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-16 00:39:42
Nie, Nie powinieneś używać prywatnych zmiennych w szablonach.
Choć podoba mi się ODPOWIEDŹ drewmoore ' a i widzę w niej idealną logikę pojęciową, implementacja jest błędna. Szablony nie istnieją w klasach komponentów, ale poza nimi. Spójrz na Ten repo Dla dowodu.
Działa tylko dlatego, że słowo kluczowe TypeScript private
tak naprawdę nie czyni członka prywatnym. Kompilacja Just-In-Time odbywa się w przeglądarce w czasie wykonywania i JS nie ma żadnej koncepcji członków prywatnych (jeszcze?). Zasługa Sandera Eliasa za to, że postawił mnie na dobrej drodze.
Z ngc
i przed kompilacją, otrzymasz błędy, jeśli spróbujesz uzyskać dostęp do prywatnych członków komponentu z szablonu. Clone demonstration repo, Zmień widoczność członków MyComponent
na prywatne, a podczas uruchamiania ngc
pojawią się błędy kompilacji. Oto również odpowiedź specyficzna dla kompilacji z wyprzedzeniem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:05
Chociaż przykład kodu wskazuje, że pytanie dotyczy języka TypeScript, nie posiada on znacznika typescript. Angular2 jest również dostępny dla Dart i jest to znacząca różnica w stosunku do Dart.
W Dartszablon nie może odwoływać się do prywatnych zmiennych klasy component, ponieważ Dart w przeciwieństwie do TypeScript skutecznie zapobiega dostępowi prywatnych członków z zewnątrz.
I still back @ drewmoores sugestia, aby pomyśleć o komponencie i to szablon jako jedna jednostka.
Update (TS) Wygląda na to, że z kompilacją offline dostęp do prywatnych właściwości będzie bardziej ograniczony również w Angular2 TS https://github.com/angular/angular/issues/11422
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-08 06:15:36
Prywatne zmienne mogą być używane w szablonie komponentu. Zobacz ściągacz angular2 dla przewodnika: https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-child-setter
Bardziej szczegółowe wyjaśnienie na temat publicznych / prywatnych członków klas w maszynopisie można znaleźć tutaj: https://www.typescriptlang.org/docs/handbook/classes.html .
Domyślnie wszyscy członkowie są publiczni. Dostęp do członków publicznych można uzyskać spoza komponentu Klasa wraz z klasą-instancją. Ale do członków prywatnych można uzyskać dostęp tylko w ramach funkcji członka klasy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-23 07:54:33
Obejściem może być użycie prywatnych zmiennych w pliku ts i użycie getterów.
private _userName = "Test Name";
get userName() {
return this._userName;
}
Jest to dobre podejście, ponieważ plik ts i html pozostają niezależne. Nawet jeśli zmienisz nazwę zmiennej _userName w pliku ts, nie musisz wprowadzać żadnych zmian w pliku szablonu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-27 05:43:44