umbraco-controllers by umbraco/umbraco-cms-backoffice-skills
npx skills add https://github.com/umbraco/umbraco-cms-backoffice-skills --skill umbraco-controllers控制器是独立的类,用于包含或跨元素复用逻辑,同时保持与元素生命周期的连接。控制器被分配给一个宿主元素,并支持生命周期方法(hostConnected、hostDisconnected、destroy),用于管理副作用、计时器、订阅和清理工作。控制器可以宿主其他控制器,从而实现功能的组合和复用。
在实现之前,请务必获取最新的文档:
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!');
}
}
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
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 调用时,绝对不要使用原始的 fetch()。始终使用配置了 Umbraco 认证上下文的生成式 OpenAPI 客户端。有关设置,请参阅 umbraco-openapi-client 技能。
就是这样!请务必获取最新的文档,保持示例简洁,生成完整可工作的代码。
每周安装次数
85
代码仓库
GitHub 星标数
17
首次出现
2026年2月4日
安全审计
已安装于
github-copilot61
cursor29
codex28
opencode27
gemini-cli25
amp25
Controllers are separate classes that contain or reuse logic across elements while maintaining connection to an element's lifecycle. A Controller is assigned to a Host Element and supports lifecycle methods (hostConnected, hostDisconnected, destroy) for managing side effects, timers, subscriptions, and cleanup. Controllers can host other controllers, enabling composition and reuse of functionality.
Always fetch the latest docs before implementing:
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 } });
}
}
Host Element : Web component that hosts the controller (all Umbraco Elements can be hosts)
Lifecycle Methods :
hostConnected() - Called when host element connects to DOMhostDisconnected() - Called when host element disconnects from DOMdestroy() - Called when controller is permanently destroyedAuto-Registration : Extending UmbControllerBase automatically registers/deregisters
Controller Composition : Controllers can host other controllers
Context Access : Controllers can consume contexts via getContext() and consumeContext()
Use Cases :
API Calls : When making API calls from controllers, NEVER use raw fetch(). Always use a generated OpenAPI client configured with Umbraco's auth context. See the umbraco-openapi-client skill for setup.
That's it! Always fetch fresh docs, keep examples minimal, generate complete working code.
Weekly Installs
85
Repository
GitHub Stars
17
First Seen
Feb 4, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
github-copilot61
cursor29
codex28
opencode27
gemini-cli25
amp25
World Monitor 智能仪表板:AI驱动的全球实时监控与地缘风险分析平台
677 周安装
PrivateInvestigator 道德人员查找工具 | 公开数据调查、反向搜索与背景研究
69 周安装
TorchTitan:PyTorch原生分布式大语言模型预训练平台,支持4D并行与H100 GPU加速
69 周安装
screenshot 截图技能:跨平台桌面截图工具,支持macOS/Linux权限管理与多模式捕获
69 周安装
tmux进程管理最佳实践:交互式Shell初始化、会话命名与生命周期管理
69 周安装
Git Rebase Sync:安全同步分支的Git变基工具,解决冲突与备份
69 周安装
LinkedIn自动化工具 - Claude Code专属,自然对话拓展人脉,避免垃圾信息
69 周安装