Кернер Денис
Работаю в СИС с 2009 г.
C 2012 года веду группу разработчиков.
До 2015 года разрабатывал модули к системе федерального уровня для ПФР - ПТК АСВ.
С 2015 года разрабатываю модули к системе Эталон.
В этом году перехожу со стека Intersystems Cache + Adobe Flex на
Java и Angular.
В свободное время иногда пишу всякое на https://github.com/Bael
Из неформального:
Воспитываю с женой двоих сыновей. Или они нас.
Любимые писатели - Терри Пратчетт, Дэн Симмонс, Джим Батчер, Дэн Абнетт, Урсуна ле Гуин, Джордж Мартин
1. Реализация вкладок и использование localStorage во многих работах
2. Код хорошо структурирован, разбираться в нем стало проще.
3. Улучшилось форматирование в работах.
4. Использование OnInit
1. Прямая работа с DOM.
2. Id в html.
3. Неиспользуемый код.
4. Беспорядок в репозиториях.
Создание
компонента
Инъекция зависимостей
Создание узла DOM (host)
Повторить для дочерних компонентов
Запустить цикл отслеживания изменений (хуки)
Angular уничтожает элемент
Работа компонента
В конструкторе - не должно быть тяжелой логики и загрузки данных. Это лучше делать в ngOnInit
Это нужно делать обязательно, для того чтобы typescript знал об интерфейсах класса
Отписка от событий
Отписка от наблюдаемых объектов.
Сброс таймеров
Декоратор @Input() (в качестве параметра в декоратор можно передать alias)
Декоратор @Input() + setter (полезно в случае необходимости пост обработки введенных данных)
Template variable
parent.component.ts
selectedStage:Stage
parent.component.html
<app-parent [stage]=selectedStage >
child.component.ts
@Input() stage;
import {Component, Input, OnInit} from '@angular/core';
import {Stage} from '../stage';
@Component({
...
})
export class StageComponent implements OnInit {
@Input()
stage: Stage; // можно также ставить декоратор на сеттер.
<app-stage [stage]="selectedStage"></app-stage>
selectedStage: Stage;
Класс родительского компонента
Шаблон родительского компонента
Класс дочернего компонента
Переменная шаблона, она же template reference variable:
Именуется как #var.
Область действия - весь шаблон.
<div class="seconds">{{timer.seconds}}</div>
<app-countdown-timer #timer></app-countdown-timer>
Шаблон дочернего компонента.html
при нажатии кнопки вызываем метод компонента
Дочерний компонент.ts
Определяем @Output эмиттер и метод компонента для бросания события через эмиттер.
Шаблон родительского компонента.html
привязка метода для обработки события
Класс родительского компонента.html
метод для обработки события
// Типизированный объект отправки событий (эмиттер) + декоратор
@Output()
changeStage: EventEmitter<Task> = new EventEmitter<Task>();
// Функция которая будет бросать событие.
// Обычно вызывается из шаблона компонента
onSelected(stageName: string) {
this.task.stage =
this.stages.find(val => val.name === stageName);
this.changeStage.emit(this.task);
}
<app-task [task]="task" (changeStage)="onChangeTaskState($event)" >
</app-task>
onChangeTaskState($event: Task) {
this.tasks = this.tasks.filter(value => value !== $event);
}
Обобщения (generics)
https://www.typescriptlang.org/docs/handbook/generics.html
Взаимодействие компонентов
https://angular.io/guide/component-interaction
https://abraxabra.ru/blog/angular/angular-2-components-inputs-and-outputs/
Давайте применим полученные знания по @Input и @Output.
Давайте построим доску Kanban
По столбцам стадии решения задачи. В строках - задачи. Задачи вытягиваются вперед.
Пример:
Компонент доски
Компонент стадии №1
Компонент стадии №2
Компонент
задачи #1
Компонент
задачи #2
Board
Stage
Task