Что означают хэштеги 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.