Что означают хэштеги Angular 2 в шаблоне?


135

Я работаю с Angular 2, и я нашел что-то вроде

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

и это работает.

Однако я не понимаю значения #searchBox . Я не нашел ничего ясного ни в документе.

Может ли кто-нибудь объяснить мне, как это работает?


2
Возможный дубликат В чем разница между скобками, скобками и звездочками в Angular2? - « На элементе DOM <div #mydiv> ссылка на элемент ». Другими словами, наличие #searchBoxэлемента - это то, что позволяет вам использовать searchBox.valueв обработчике клавиатуры.
Джо Клей

это переменная.
Гарри

Ответы:


177

Это синтаксис, используемый в системе шаблонов Angular 2, которая объявляет элементы DOM как переменные.

Здесь я даю свой компонент URL шаблона:

import {Component} from 'angular2/core';

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

export class HarrysApp {}

Шаблоны отображают HTML. В шаблоне вы можете использовать привязку данных, свойств и событий. Это достигается с помощью следующего синтаксиса:

# - объявление переменной

() - привязка события

[] - привязка собственности

[()] - двусторонняя привязка свойств

{{ }} - интерполяция

* - структурные директивы

#Синтаксис может объявлять локальные имена переменных , который ссылается на объекты DOM в шаблоне. например

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

6
Рабочий пример: <input #bla style="display: none;" value="Foo" /<div> {{bla.value}} </div>. Foo отображается в div.
широкополосный

3
И разве это объявление переменной не может быть переменной? Я пытаюсь создать материальные пункты меню из сложного вложенного объекта меню, и это поставило меня в тупик. Кажется, я не могу динамически создавать переменные dom. Они действительно должны быть жестко запрограммированы в домене?
crowmagnumb

2
Ссылка на официальный документ: angular.io/guide/…
千 木 郷


32

От angulartraining.com :

Ссылочные переменные шаблона - это маленькая жемчужина, которая позволяет делать много приятных вещей с помощью Angular. Я обычно называю эту функцию «синтаксисом хэштега», потому что он использует простой хештег для создания ссылки на элемент в шаблоне:

<input #phone placeholder="phone number">

То, что делает приведенный выше синтаксис, довольно просто: оно создает ссылку на  элемент ввода, который можно использовать позже в моем шаблоне. Обратите внимание, что областью действия для этой переменной является весь шаблон HTML, в котором определена ссылка.

Вот как я могу использовать эту ссылку, чтобы получить значение ввода, например:

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

Обратите внимание, что  телефон  относится к  экземпляру объекта HTMLElement для  ввода . В результате у  телефона  есть все свойства и методы любого элемента HTMLElement (id, name, innerHTML, value и т. Д.)

Вышеупомянутое - хороший способ избежать использования ngModel или какого-либо другого вида привязки данных в простой форме, которая не требует многого с точки зрения проверки.


Это также работает с компонентами?

Ответ ДА!

... лучшая часть этого заключается в том, что мы получаем ссылку на фактический экземпляр компонента, HelloWorldComponent, поэтому мы можем получить доступ к любым методам или свойствам этого компонента (даже если они объявлены как закрытые или защищенные, что удивительно) :

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

export class HelloComponent {
   name = 'Angular';
}

[...]

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

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

2
«даже если они объявлены как частные или защищенные, что удивительно» - имейте в виду, что спецификаторы доступа являются защитой времени компиляции и обычно ничего не делают после компиляции и запуска кода.
Tongfa

21

Он создает переменную шаблона, которая ссылается на

  • inputэлемент , если элемент является простым DOM элемент
  • экземпляр компонента или директивы, если это элемент с компонентом или директивой
  • некоторые конкретные компоненты или директивы , если он используется , как #foo="bar"когда barэто
@Directive({ // or @Component
  ...
  exportAs: 'bar'
})

На такую ​​переменную шаблона можно ссылаться в привязках шаблона или в запросах элементов, например

@ViewChild('searchBox') searchBox:HTMLInputElement;

Это потрясающе. Между прочим, он очень похож на ngModel, не так ли?
добрый пользователь

На самом деле, нет. ngModelпредназначен для интеграции форм. Вы можете делать все другие виды привязок без ngModel.
Günter Zöchbauer 08

И последнее: как вы использовали, ngAfterViewInitне импортировав его? А внедрение? Это встроенная функция плункера?
добрый пользователь

Нет, Angular не зависит от того, какие интерфейсы жизненного цикла будут объявлены явно. Если метод существует, он вызывается. Реализация интерфейсов явно является хорошей практикой.
Гюнтер Цохбауэр
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.