FASTElement предоставляет мощный механизм для связывания компонентов и контроллеров с DOM, позволяя создавать динамические и реактивные интерфейсы без необходимости сложной ручной синхронизации состояния. Контроллеры в FASTElement действуют как промежуточное звено между элементом и внешней логикой, управляя поведением компонента, его состоянием и реакцией на события.
Контроллеры позволяют:
Каждый контроллер реализует интерфейс Controller,
содержащий методы жизненного цикла:
class ExampleController {
constructor(host) {
this.host = host;
}
connectedCallback() {
// Выполняется при подключении элемента к DOM
}
disconnectedCallback() {
// Выполняется при удалении элемента из DOM
}
hostUpdated() {
// Вызывается после обновления свойств хоста
}
}
host — это элемент FASTElement, к которому подключен
контроллер. Он предоставляет доступ к его свойствам, методам и
событиям.
Контроллеры подключаются через статическое свойство
@controller или метод addController:
import { FASTElement } from "@microsoft/fast-element";
class MyElement extends FASTElement {
static controllers = [ExampleController];
}
В этом случае контроллер автоматически создается при инициализации
элемента и получает ссылку на host.
addControllerimport { FASTElement } from "@microsoft/fast-element";
class MyElement extends FASTElement {
connectedCallback() {
super.connectedCallback();
this.addController(new ExampleController(this));
}
}
Метод addController позволяет динамически подключать
контроллеры в любой момент жизненного цикла компонента, что удобно для
условной логики или отложенной инициализации.
Контроллер реагирует на события жизненного цикла элемента:
connectedCallback – вызывается при
вставке элемента в DOM. Здесь обычно подписываются события, запускаются
таймеры или делаются сетевые запросы.hostUpdated – вызывается после
обновления любого свойства хоста, позволяет синхронизировать внутреннее
состояние контроллера с состоянием элемента.disconnectedCallback – вызывается при
удалении элемента из DOM, освобождает ресурсы: удаляет слушатели
событий, очищает таймеры, отменяет подписки.Пример контроллера с полным циклом:
class TimerController {
constructor(host) {
this.host = host;
this.intervalId = null;
}
connectedCallback() {
this.intervalId = setInterval(() => {
this.host.time = new Date().toLocaleTimeString();
}, 1000);
}
disconnectedCallback() {
clearInterval(this.intervalId);
}
hostUpdated() {
console.log('Хост обновлен, текущее время:', this.host.time);
}
}
Контроллер может подписываться на пользовательские события элемента:
class ClickController {
constructor(host) {
this.host = host;
this.onCl ick = this.onClick.bind(this);
}
connectedCallback() {
this.host.addEventListener('click', this.onClick);
}
disconnectedCallback() {
this.host.removeEventListener('click', this.onClick);
}
onClick(event) {
console.log('Элемент кликнут', event);
}
}
Поддержка событий обеспечивает полное разделение обязанностей: шаблон и структура элемента остаются чистыми, а логика реакций на действия пользователя сосредоточена в контроллере.
Контроллер может читать и изменять свойства хоста напрямую:
class CounterController {
constructor(host) {
this.host = host;
}
increment() {
this.host.count++;
}
reset() {
this.host.count = 0;
}
}
Если свойство элемента является наблюдаемым
(@observable), любые изменения будут автоматически
триггерить обновления шаблона:
import { FASTElement, observable } from "@microsoft/fast-element";
class CounterElement extends FASTElement {
@observable count = 0;
static controllers = [CounterController];
}
Элемент может иметь несколько контроллеров одновременно. Они
подключаются как массив в static controllers:
class MyElement extends FASTElement {
static controllers = [TimerController, ClickController, CounterController];
}
Контроллеры будут инициализированы в порядке, указанном в массиве, и их методы жизненного цикла будут вызваны поочередно. Это позволяет комбинировать разные аспекты поведения без смешивания логики.
Методы addController и removeController
позволяют управлять контроллерами на лету:
const ctrl = new TimerController(myElement);
myElement.addController(ctrl);
// позже можно удалить контроллер
myElement.removeController(ctrl);
Такой подход полезен для временной логики, например, при условном отображении функциональности или активации поведения только при определенных событиях.
static controllers или
addController.connectedCallback,
disconnectedCallback, hostUpdated.Контроллеры в FASTElement создают мощную систему реактивного управления компонентами, делая код чистым, модульным и легко тестируемым.