关于 umbraco-controllers
帮助开发者为 Umbraco 后台元素实现可复用控制器,管理生命周期、上下文和副作用。内容包括控制器基类、托管方式及清理逻辑示例。
主要功能
- 01生命周期钩子管理
- 02自动注册与注销
- 03控制器组合
- 04上下文访问
- 05订阅与定时器清理
适用场景
- 01在多个元素间复用逻辑
- 02管理订阅和定时任务
- 03从控制器访问 Umbraco 上下文
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ umbraco/ umbraco-cms-backoffice-skills --skill umbraco-controllers安装后在 Claude Code 中输入/umbraco-controllers确认已加载。
详细介绍
Umbraco 控制器
它是什么?
控制器是独立的类,可以在不同元素之间包含或复用逻辑,同时保持与元素生命周期的关联。控制器会分配给宿主元素,并支持生命周期方法(hostConnected、hostDisconnected、destroy),用于管理副作用、计时器、订阅和清理工作。控制器可以托管其他控制器,从而实现功能的组合与复用。
文档
实现之前务必获取最新文档:
- 主要文档:https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/foundation/umbraco-controller
- 编写自定义控制器:https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/foundation/umbraco-controller/write-your-own-controller
- 基础:https://docs.umbraco.com/umbraco-cms/extend-your-project/backoffice-extensions/foundation
工作流
- 获取文档 - 对上述 URL 使用 WebFetch
- 提问 - 是否需要自定义控制器?需要哪些生命周期事件?需要进行哪些清理?
- 生成代码 - 根据最新文档,实现继承自 UmbControllerBase 的控制器
- 说明 - 展示创建的内容以及如何托管该控制器
最小示例
基本自定义控制器
import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
export class MyController extends UmbControllerBase {
constructor(host: UmbControllerHost) {
super(host);
// Auto-registers with host
}
override hostConnected() {
super.hostConnected();
console.log('Controller connected!');
}
override hostDisconnected() {
super.hostDisconnected();
console.log('Controller disconnected!');
}
override destroy() {
super.destroy();
console.log('Controller destroyed!');
}
}
计时器控制器示例
import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
export class TimerController extends UmbControllerBase {
#timer?: number;
#secondsAlive = 0;
constructor(host: UmbControllerHost) {
super(host);
}
override hostConnected() {
super.hostConnected();
// Start timer when element connects to DOM
this.#timer = window.setInterval(this.#onInterval, 1000);
}
override hostDisconnected() {
super.hostDisconnected();
// Clean up timer when element disconnects
if (this.#timer) {
clearInterval(this.#timer);
}
}
#onInterval = () => {
this.#secondsAlive++;
console.log(`Controller active for ${this.#secondsAlive} seconds`);
};
override destroy() {
super.destroy();
if (this.#timer) {
clearInterval(this.#timer);
}
}
getSecondsAlive(): number {
return this.#secondsAlive;
}
}
在元素中托管控制器
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import { TimerController } from './timer-controller.js';
export class MyElement extends UmbLitElement {
#timerController = new TimerController(this);
render() {
return html`
<div>
Active for: ${this.#timerController.getSecondsAlive()}s
</div>
`;
}
}
手动注册(不推荐)
export class MyManualController {
#host: UmbControllerHost;
constructor(host: UmbControllerHost) {
this.#host = host;
// Manual registration required
this.#host.addUmbController(this);
}
hostConnected() {
console.log('Connected');
}
destroy() {
// Manual deregistration required
this.#host.removeUmbController(this);
}
}
可访问上下文的控制器
import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification';
export class NotificationController extends UmbControllerBase {
async showSuccess(message: string) {
// Controllers can access contexts via getContext
const context = await this.getContext(UMB_NOTIFICATION_CONTEXT);
context?.peek('positive', { data: { message } });
}
}
关键概念
宿主元素:托管控制器的 Web 组件(所有 Umbraco 元素都可以作为宿主)
生命周期方法:
hostConnected()- 宿主元素连接到 DOM 时调用hostDisconnected()- 宿主元素与 DOM 断开连接时调用destroy()- 控制器被永久销毁时调用
自动注册:继承 UmbControllerBase 会自动注册和注销
控制器组合:控制器可以托管其他控制器
上下文访问:控制器可以通过 getContext() 和 consumeContext() 使用上下文
使用场景:
- 管理订阅和清理工作
- 处理计时器和间隔
- 协调副作用
- 在多个元素间复用逻辑
- 管理 API 调用和数据获取
API 调用:从控制器进行 API 调用时,绝不要使用原始 fetch()。务必使用配置了 Umbraco 身份验证上下文的生成式 OpenAPI 客户端。有关设置,请参阅 umbraco-openapi-client 技能。
就是这样!务必获取最新文档,保持示例简洁,并生成完整可运行的代码。
评论
支持 Markdown