Co oznaczają hashtagi Angular 2 w szablonie?

135

Pracuję z Angular 2 i znalazłem coś takiego

<input #searchBox (keyup)="search(searchBox.value)"

i to działa.

Jednak nie rozumiem znaczenia #searchBox . Nie znalazłem nic jasnego ani w doktorze.

Czy ktoś mógłby mi wyjaśnić, jak to działa?

Ackuser
źródło
2
Możliwy duplikat Jaka jest różnica między nawiasami, nawiasami i gwiazdkami w Angular2? - „ W elemencie DOM <div #mydiv> odniesienie do elementu ”. Innymi słowy, posiadanie #searchBoxelementu jest tym, co pozwala na użycie go searchBox.valuew module obsługi klucza.
Joe Clay
jego zmienna.
Harry,

Odpowiedzi:

177

Jego składnia jest używana w systemie szablonów Angular 2, który deklaruje elementy DOM jako zmienne.

Tutaj daję mojemu komponentowi adres URL szablonu:

import {Component} from 'angular2/core';

@Component({
   selector: 'harrys-app',
   templateUrl: 'components/harry/helloworld.component.html'
})

export class HarrysApp {}

Szablony renderują HTML. W szablonie można używać danych, powiązań właściwości i powiązań zdarzeń. Osiąga się to za pomocą następującej składni:

# - deklaracja zmiennej

() - oprawa wydarzenia

[] - wiązanie majątkowe

[()] - dwukierunkowe powiązanie własności

{{ }} - interpolacja

* - dyrektywy strukturalne

#Składnia może zadeklarować lokalne nazwy zmiennych, które Referencje DOM obiektów w szablonie. na przykład

 <span [hidden]="harry.value">*</span>
 <input type="text" #harry>
 {{ harry.value }}
Złupić
źródło
6
Przykład działania: <input #bla style="display: none;" value="Foo" /<div> {{bla.value}} </div>. Foo jest wyświetlane w div.
szerokopasmowy
3
I nie ma sposobu, aby sama deklaracja zmiennej była zmienną? Próbuję stworzyć materialne pozycje menu ze złożonego, zagnieżdżonego obiektu menu i to mi przeszkadza. Nie mogę dynamicznie tworzyć zmiennych dom. Czy naprawdę muszą być na stałe zakodowane w DOM?
crowmagnumb
2
Oficjalny numer referencyjny dokumentu: angular.io/guide/…
千 木 郷
65

Po ustawieniu tego #searchBox możesz uzyskać te dane wejściowe w swoim Typescript, takim jak

    @ViewChild('searchBox') searchBox;
    console.info(searchBox.nativeElement.value)

EDYTOWAĆ

Dodanie przykładu: https://plnkr.co/edit/w2FVfKlWP72pzXIsfsCU?p=preview

Matheus Martins
źródło
31

Z angulartraining.com :

Zmienne referencyjne do szablonów to mały klejnot, który pozwala zrobić wiele fajnych rzeczy w Angular. Zwykle nazywam tę funkcję „składnią hashtagu”, ponieważ, cóż, opiera się na prostym hashtagu do utworzenia odniesienia do elementu w szablonie:

<input #phone placeholder="phone number">

To, co robi powyższa składnia, jest dość proste: tworzy odniesienie do  elementu wejściowego , którego można użyć później w moim szablonie. Zwróć uwagę, że zasięgiem dla tej zmiennej jest cały szablon HTML, w którym zdefiniowano odwołanie.

Oto jak mogę użyć tego odniesienia, aby uzyskać wartość danych wejściowych, na przykład:

<!-- phone refers to the input element --> 
<button (click)="callPhone(phone.value)">Call</button>

Zwróć uwagę, że  phone  odwołuje się do  instancji obiektu HTMLElement jako  wejścia . W rezultacie  telefon  ma wszystkie właściwości i metody dowolnego elementu HTMLElement (identyfikator, nazwa, innerHTML, wartość itp.)

Powyższe jest dobrym sposobem na uniknięcie używania ngModel lub innego rodzaju wiązania danych w prostej formie, która nie wymaga wiele pod względem walidacji.


Czy to działa również z komponentami?

Odpowiedź brzmi tak!

... najlepsze jest to, że otrzymujemy odniesienie do rzeczywistej instancji komponentu, HelloWorldComponent, dzięki czemu możemy uzyskać dostęp do wszelkich metod lub właściwości tego komponentu (nawet jeśli są zadeklarowane jako prywatne lub chronione, co jest zaskakujące) :

@Component({
  selector: 'app-hello',
  // ...

export class HelloComponent {
   name = 'Angular';
}

[…]

<app-hello #helloComp></app-hello>

<!-- The following expression displays "Angular" -->
{{helloComp.name}}
ruffin
źródło
2
„nawet jeśli są zadeklarowane jako prywatne lub chronione, co jest zaskakujące” - należy pamiętać, że specyfikatory dostępu chronią czas kompilacji i zazwyczaj nie robią nic po skompilowaniu i uruchomieniu kodu.
Tongfa
21

Tworzy zmienną szablonową, która odwołuje się do

  • inputelementem, gdy element jest zwykłym elementu DOM
  • instancja komponentu lub dyrektywy, jeśli jest to element z komponentem lub dyrektywą
  • jakiś określony komponent lub dyrektywa, jeśli jest używana tak, jak #foo="bar"kiedy barjest
@Directive({ // or @Component
  ...
  exportAs: 'bar'
})

Do takiej zmiennej szablonu można się odwoływać w powiązaniach szablonów lub w zapytaniach o elementy, takich jak

@ViewChild('searchBox') searchBox:HTMLInputElement;
Günter Zöchbauer
źródło
To jest niesamowite. Nawiasem mówiąc - jest dość podobny do ngModel, prawda?
miły użytkownik
Nie całkiem. ngModelsłuży do integracji formularzy. Możesz wykonywać wszystkie inne rodzaje powiązań bez ngModel.
Günter Zöchbauer
Ostatnia rzecz, w jaki sposób używałeś ngAfterViewInitbez importowania go? A wdrażanie? Czy to wbudowana funkcja Plunkera?
miły użytkownik
Nie, Angular nie zależy od jawnie zadeklarowanych interfejsów cyklu życia. Jeśli metoda istnieje, zostanie wywołana. Jednak jawne implementowanie interfejsów jest dobrą praktyką.
Günter Zöchbauer