controller.ts
Назначение файла
Модуль реализует декларативный API контроллеров Nrgy.js: типы контекста, extensions, builder деклараций и runtime-конструктор контроллера.
Общая информация
Этот файл является центром MVC/MVVM-слоя в @nrgyjs/core. Через него определяются:
- типы контроллеров и сервисов;
- контекст контроллера с
scopeи параметрами; - механизм extensions;
- фабричный и class-based способ объявления контроллеров.
Другие MVC-модули, включая withView() и declareViewModel(), строятся поверх этих контрактов.
Концептуальная архитектура
Архитектура модуля состоит из нескольких частей:
- Базовые типы
Controller,ControllerDeclaration,BaseControllerContext,ExtensionFn. BaseController, который создаетControllerContext, откладываетonCreated()в microtask и уничтожаетScopeвdestroy().ControllerDeclarationBuilder, позволяющий пошагово добавлятьparams()иextend(), а затем завершать декларацию черезapply()илиgetBaseClass().createControllerContext(), которая собираетscope, параметры, extension params и helpercreate()для вложенного создания контроллеров.- Провайдеры
provideControllerParams()иprovideExtensionParams(), через которые параметры прокидываются в extension-механику.
Такой дизайн поддерживает функциональные и class-based контроллеры с единым жизненным циклом.
Описание публичного API
Основные типы
BaseService: базовый тип сервиса контроллера.Controller<TService>: сервис с обязательным методомdestroy().ControllerParams,BaseControllerContext,ControllerParamsContext<T>: типы параметров и контекста.ExtensionFn<TSourceContext, TContextExtension>: функция расширения контекста контроллера.ExtensionParamsProvider: provider дополнительных параметров для extensions.ControllerDeclaration<TContext, TService>: тип конструктора контроллера.ControllerContext<TContext>: контекст фабрики контроллера с helper-методомcreate().ControllerFactory<TContext, TService>: фабрика функционального контроллера.
Классы и ошибки
ControllerConstructorError: ошибка создания контроллера.BaseController<TContext>: базовый класс для class-based контроллеров.ControllerDeclarationBuilder<TContext>: builder декларации контроллера.
Функции
declareController(factory?): создает либо готовую декларацию, либо builder.provideControllerParams(params): упаковывает params вExtensionParamsProvider.provideExtensionParams(params): добавляет произвольные extension-параметры.
Примеры использования
ts
import { declareController } from '@nrgyjs/core';
const CounterController = declareController()
.params<{ initialValue: number }>()
.apply(({ scope, params }) => {
const count = scope.atom(params.initialValue);
return {
count,
increase: () => count.update((prev) => prev + 1),
};
});
const controller = new CounterController({ initialValue: 5 });ts
import { BaseController, type ControllerParamsContext } from '@nrgyjs/core';
class LoggerController extends BaseController<
ControllerParamsContext<{ prefix: string }>
> {
log(message: string) {
console.log(this.params.prefix, message);
}
}