Пойдем со мной, пока я перевариваю информацию из курса Удеми Полное руководство по Angular2 Максимилиана Шварцмюллера. Щелкните здесь, чтобы начать с начала. Эта серия статей предполагает наличие некоторых предварительных знаний об AngularJS, хотя, вероятно, это не критично для понимания всего этого. Это помогает мне писать об этих концепциях и создавать репозиторий систематизированных заметок для использования в будущем. Если вы сочтете это полезным или поймете какие-либо ошибки, дайте мне знать!
Что такое привязка данных?
Привязка данных - это взаимодействие шаблонов и бизнес-логики. Например:
<input type='text' [value]='message'>
Это односторонняя привязка, позволяющая установить value
входного значения на то, что message
находится в компоненте. Изменения ввода в представлении не повлияют на значение message
.
Вот весь компонент:
import {Component} from '@angular/core'; @Component({ selector: 'app-another', template: ` <input type="text" [value]="message" style="width:800px;font-size:24px"> `, styles: [] }) export class AnotherComponent { message: string = 'A message from the component!'; }
Теперь мы можем делать всевозможные вещи со стороны логики, а затем передавать результаты этой логики в представление.
Помните, что эта работа с message: string = ''
называется «типизацией» и является ключевым аспектом использования Typescript, на котором по умолчанию написан язык Angular.
Одностороннее связывание против двустороннего связывания
Привязки в Angular2 (в отличие от AngularJS) по умолчанию односторонние. Это заставляет наши программы работать быстрее. Если нам нужно использовать двустороннюю привязку (то есть мы хотим, чтобы изменения в представлении влияли на логику), мы должны написать:
<input type='text' [(value)]='message'>
По какой-то безумной причине это называют «бананом в коробке».
Строчная интерполяция
Один из простейших методов привязки данных - использование переменных для печати текста. Здесь мы можем увидеть оба варианта использования message
на наш взгляд. Код для первого показан выше, если мы хотим просто вывести текст в наше представление, мы можем использовать {{message}}
.
Привязка свойств
Мы также можем использовать привязку для установки свойств элементов HTML в представлениях наших компонентов. Например:
<p [ngClass]="{ green: true }">Some text.</p>
Жесткие скобки означают, что ngClass
получит некоторую информацию от логики. Фигурные скобки означают, что код Javascript находится внутри. Теперь все, что нам нужно сделать, это определить наш green
класс в таблице стилей, связанной с этим компонентом (или в глобальной таблице стилей), и наш текст станет зеленым.
ngStyle
Мы также можем использовать привязки для воздействия на встроенные стили:
<input type="text" [value]="message" [ngStyle]="{ display: displayType() }" >
Теперь мы можем определить displayType
в классе экспорта:
displayType() { return 'in-line'; };
Конечно, если мы это сделаем, ничего не изменится. Но если мы изменим метод на возврат none
, мы скроем поле ввода.
Привязка настраиваемых свойств
Встроенные привязки свойств хороши и все такое, но, очевидно, мы хотим иметь возможность создавать свои собственные. Мы делаем это, указав декоратор @Input()
в нашей переменной message
:
@Input() message: string = 'A message from the component!'
И добавил Input
к нашему импорту в верхней части файла. Теперь, когда мы используем этот компонент в его родительском элементе, мы можем установить значение сообщения:
<app-another [message]="'I changed it!'"></app-another>
Обратите внимание на двойные кавычки. Это какая-то чушь Angular, с которой нам просто нужно разобраться.
Мы также можем добавить входные данные в декоратор @Component
и убрать необходимость в декораторе @Input
и импорте:
@Component({ [ ... ] inputs: ['message'] })
Связывание событий
Наконец, нам нужно, чтобы наше приложение реагировало на события, а не только на переменные. Для этого воспользуемся привязкой к событию. Самый простой случай - это метод, который вызывается при нажатии кнопки:
# view <button (click)='clickMethod()'>Click!</button> # logic clickMethod() { alert('Clicked!') }
Эмиссия событий
Нам также нужно, чтобы наше приложение реагировало на настраиваемые события. Действия, которые происходят в DOM, могут «испускать», когда они происходят, и мы можем создать функциональность, чтобы реагировать на это излучение.
В дочернем компоненте нам нужно импортировать Output
и:
@Output() clicked = new EventEmitter<string>(); clickMethod() { this.clicked.emit('It worked!'); }
(Как вы могли догадаться, мы также можем сократить это, включив выходные данные в outputs: ['outputName']
, как мы это сделали с входами.)
А когда мы используем компонент в DOM, мы можем прикрепить настраиваемую привязку события:
<app-another (clicked)="onClicked($event)"></app-another>
Это позволит нашему родительскому компоненту «прослушивать» событие clicked
. Он испускается clickMethod()
в дочернем компоненте. $event
- это встроенный объект, который будет хранить полезные данные, полученные от события (в данном случае это 'It worked!'
).
Теперь внутри компонента parent мы добавляем:
onClicked(value: string) { alert(value); }
Мне нужно было еще немного прочитать этот раздел после видео. Вот ссылка, которую я использовал.
Двусторонняя привязка данных
При двусторонней привязке, как и следовало ожидать, наши переменные будут отслеживать изменения и динамически обновлять представление. Вот он в действии в представлении:
<input type="text" [(ngModel)]="person.name"><br> {{person.name}}
Это [(ngModel)]
является подходящей синтаксической комбинацией привязки и прослушивания, потому что она выполняет и то, и другое. Теперь, когда person.name
обновляется, вид изменится (помните строковую интерполяцию выше?)
В нашем компоненте нам нужно всего лишь:
person = { name: 'Amber' }
И это все, что касается раздела 2! Он переходит к хукам жизненного цикла и ViewChild()
и ContentChild()
, но на этом я остановлюсь. Следующий раздел представляет собой курсовой проект, так что это должно быть весело. Прошлая неделя полностью ускользнула от меня в плане изучения Angular, так что, надеюсь, я скоро вернусь.