O que significa hashtags Angular 2 no modelo?

135

Estou trabalhando com angular 2 e encontrei algo como

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

e funciona.

No entanto, não entendo o significado de #searchBox . Também não encontrei nada claro no documento.

Alguém poderia me explicar como isso funciona?

ackuser
fonte
2
Possível duplicata de Qual é a diferença entre parênteses, colchetes e asteriscos no Angular2? - " Em um elemento DOM <div #mydiv> uma referência ao elemento ". Em outras palavras, ter #searchBoxno elemento é o que permite que você use searchBox.valueno manipulador de chaves.
9788 Joe Barro
é uma variável.
Harry

Respostas:

177

É a sintaxe usada no sistema de modelagem Angular 2 que declara elementos DOM como variáveis.

Aqui, dou ao meu componente um URL de modelo:

import {Component} from 'angular2/core';

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

export class HarrysApp {}

Modelos renderizam HTML. Em um modelo, você pode usar dados, associação de propriedades e associação de eventos. Isso é realizado com a seguinte sintaxe:

# - declaração variável

() - associação de eventos

[] - ligação de propriedade

[()] - ligação de propriedade bidirecional

{{ }} - interpolação

* - diretivas estruturais

A #sintaxe pode declarar nomes de variáveis ​​locais que referenciam objetos DOM em um modelo. por exemplo

 <span [hidden]="harry.value">*</span>
 <input type="text" #harry>
 {{ harry.value }}
atormentar
fonte
6
Exemplo de trabalho: <input #bla style="display: none;" value="Foo" /<div> {{bla.value}} </div>. Foo é exibido em div.
banda larga
3
E não há como essa declaração de variável ser uma variável? Estou tentando criar itens de menu materiais a partir de um objeto complexo de menus aninhados e isso me atrapalhou. Não consigo criar dinamicamente as variáveis ​​dom. Eles realmente precisam ser codificados no domínio?
crowmagnumb
2
Referência oficial do documento: angular.io/guide/…
千 木 郷
65

Ao definir essa #searchBox, você pode obter essa entrada no seu Typecript, como

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

EDITAR

Adicionando algum exemplo: https://plnkr.co/edit/w2FVfKlWP72pzXIsfsCU?p=preview

Matheus Martins
fonte
31

Em angulartraining.com :

As variáveis ​​de referência de modelo são uma pequena jóia que permite fazer muitas coisas legais com o Angular. Eu costumo chamar esse recurso de "sintaxe da hashtag" porque, bem, ele se baseia em uma hashtag simples para criar uma referência a um elemento em um modelo:

<input #phone placeholder="phone number">

O que a sintaxe acima faz é bastante simples: ele cria uma referência ao  elemento de entrada que pode ser usado posteriormente no meu modelo. Observe que o escopo dessa variável é o modelo HTML inteiro no qual a referência está definida.

Aqui está como eu poderia usar essa referência para obter o valor da entrada, por exemplo:

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

Observe que  phone  refere-se à  instância do objeto HTMLElement da  entrada . Como resultado, o  telefone  possui todas as propriedades e métodos de qualquer HTMLElement (ID, nome, innerHTML, valor etc.)

A descrição acima é uma boa maneira de evitar o uso do ngModel ou algum outro tipo de ligação de dados de forma simples que não exija muito em termos de validação.


Isso também funciona com componentes?

A resposta é sim!

... a melhor parte disso é que estamos recebendo uma referência à instância real do componente, HelloWorldComponent, para que possamos acessar quaisquer métodos ou propriedades desse componente (mesmo que sejam declarados como privados ou protegidos, o que é surpreendente) :

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

export class HelloComponent {
   name = 'Angular';
}

[...]

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

<!-- The following expression displays "Angular" -->
{{helloComp.name}}
ruffin
fonte
2
"mesmo que sejam declarados como privados ou protegidos, o que é surpreendente" - lembre-se de que os especificadores de acesso são um tempo de compilação e normalmente não fazem nada depois que o código é compilado e em execução.
Tongfa
21

Ele cria uma variável de modelo que referencia

  • o inputelemento se o elemento for um elemento DOM simples
  • a instância de componente ou diretiva, se for um elemento com um componente ou diretiva
  • algum componente ou diretiva específica, se usado como #foo="bar"quando baré
@Directive({ // or @Component
  ...
  exportAs: 'bar'
})

Essa variável de modelo pode ser referenciada em ligações de modelo ou em consultas de elemento como

@ViewChild('searchBox') searchBox:HTMLInputElement;
Günter Zöchbauer
fonte
Isso é incrível. A propósito - é bem parecido com o ngModel, não é?
tipo usuário
Na verdade não. ngModelé para integração de formulários. Você pode fazer todos os outros tipos de ligações sem ngModel.
Günter Zöchbauer 8/17
Última coisa, como você usou ngAfterViewInitsem realmente importá-lo? E implementando? É um recurso incorporado no plunker?
tipo usuário
Não, o Angular não depende que as interfaces do ciclo de vida sejam declaradas explicitamente. Se o método existir, ele será chamado. A implementação explícita das interfaces é uma boa prática.
Günter Zöchbauer 8/17