173 votes

Que signifie "hashtags" dans un modèle Angular 2 ?

Je travaille avec angular 2 et j'ai trouvé quelque chose du genre

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

et ça marche.

Cependant, je ne comprends pas la signification de #searchBox . Je n'ai rien trouvé de clair non plus dans la doc.

Quelqu'un peut-il m'expliquer comment cela fonctionne ?

2 votes

Duplicata possible de Quelle est la différence entre les parenthèses, les crochets et les astérisques dans Angular2 ? - " Sur un élément DOM <div #mydiv> une référence à l'élément ". En d'autres termes, le fait d'avoir #searchBox sur l'élément est ce qui vous permet d'utiliser searchBox.value dans le gestionnaire de touches.

0 votes

C'est une variable.

207voto

Harry Points 1961

Il s'agit d'une syntaxe utilisée dans le système de création de modèles d'Angular 2 qui déclare les éléments du DOM comme des variables.

Ici, je donne à mon composant une URL de modèle :

import {Component} from 'angular2/core';

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

export class HarrysApp {}

Les modèles rendent le HTML. Dans un modèle, vous pouvez utiliser la liaison de données, de propriétés et d'événements. Ceci est réalisé avec la syntaxe suivante :

# - déclaration de variable

() - liaison avec les événements

[] - liaison de propriété

[()] - liaison bidirectionnelle des propriétés

{{ }} - interpolation

* - directives structurelles

El # permet de déclarer des noms de variables locales qui font référence à des objets DOM dans un modèle. Par exemple

 <span [hidden]="harry.value">*</span>
 <input type="text" #harry>
 {{ harry.value }}

6 votes

Exemple de travail : <input #bla style="display: none;" value="Foo" /<div> {{bla.value}} </div> . Foo est affiché dans le div.

3 votes

Et il n'y a aucun moyen pour que cette déclaration de variable soit elle-même une variable ? J'essaie de créer des éléments de menu matériels à partir d'un objet complexe de menus imbriqués et cela m'a bloqué. Je ne parviens pas à créer dynamiquement les variables dom. Doivent-elles vraiment être codées en dur dans le domaine ?

3 votes

Référence du document officiel : angular.io/guide/

71voto

Matheus Martins Points 502

Lorsque vous définissez cette #searchBox, vous pouvez obtenir cette entrée dans votre type de script comme suit

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

EDIT

Ajout d'un exemple : https://plnkr.co/edit/w2FVfKlWP72pzXIsfsCU?p=preview

37voto

ruffin Points 1906

De angulartraining.com :

Variables de référence du modèle sont un petit bijou qui permet de faire beaucoup de choses intéressantes avec Angular. J'ai l'habitude d'appeler cette fonctionnalité "la syntaxe hashtag" parce que, eh bien, elle s'appuie sur un simple hashtag pour créer une référence à un élément dans un template :

<input #phone placeholder="phone number">

Ce que fait la syntaxe ci-dessus est assez simple : Elle crée une référence à l'objet  entrée qui pourra être utilisé plus tard dans mon modèle. Notez que la portée de cette variable est l'ensemble du modèle HTML dans lequel la référence est définie.

Voici comment je pourrais utiliser cette référence pour obtenir la valeur de l'entrée, par exemple :

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

Notez que  téléphone  fait référence à la  HTMLElement pour l'instance de l'objet  entrée . En conséquence,  téléphone  possède toutes les propriétés et méthodes de tout HTMLElement (id, name, innerHTML, value, etc.).

Ce qui précède est un bon moyen d'éviter l'utilisation de ngModel ou d'un autre type de liaison de données dans un formulaire simple qui ne nécessite pas beaucoup de validation.


Cela fonctionne-t-il également avec les composants ?

La réponse est OUI !

... le plus intéressant est que nous obtenons une référence à l'instance réelle du composant, HelloWorldComponent, et que nous pouvons donc accéder à toutes les méthodes et propriétés de ce composant (même si elles sont déclarées comme privées ou protégées, ce qui est surprenant) :

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

export class HelloComponent {
   name = 'Angular';
}

[...]

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

<!-- The following expression displays "Angular" -->
{{helloComp.name}}

2 votes

"même s'ils sont déclarés comme privés ou protégés, ce qui est surprenant" - gardez à l'esprit que les spécificateurs d'accès sont une protection au moment de la compilation, et ne font généralement rien après la compilation et l'exécution du code.

24voto

Günter Zöchbauer Points 21340

Il crée une variable modèle qui fait référence à

  • le site input si l'élément est un élément DOM ordinaire
  • l'instance du composant ou de la directive s'il s'agit d'un élément avec un composant ou une directive
  • un composant ou une directive spécifique s'il est utilisé comme #foo="bar" quand bar est

    @Directive({ // or @Component ... exportAs: 'bar' })

Une telle variable de modèle peut être référencée dans des liaisons de modèles ou dans des requêtes d'éléments telles que

@ViewChild('searchBox') searchBox:HTMLInputElement;

0 votes

C'est incroyable. Au fait - c'est assez similaire au ngModel, n'est-ce pas ?

0 votes

Pas vraiment. ngModel est pour l'intégration des formulaires. Vous pouvez faire toutes les autres sortes de liaisons sans ngModel .

0 votes

Dernière chose, comment avez-vous utilisé ngAfterViewInit sans l'importer réellement ? Et l'implémenter ? C'est une fonctionnalité intégrée à Plunker ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X