bricks/aidocs/modal.md
2025-10-05 06:39:58 +08:00

295 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `bricks` 模态组件技术文档
> **版本1.0**
> **模块Modal, BaseModal, ModalForm**
本文档描述了 `bricks` 框架中与模态窗口相关的类,包括 `BaseModal``Modal``ModalForm`。这些类用于创建可重用的弹出层Modal组件支持自定义定位、样式、自动关闭、超时关闭等功能。
---
## 目录
- [概述](#概述)
- [核心类结构](#核心类结构)
- [`bricks.BaseModal`](#bricksbasemodal)
- [构造函数参数](#构造函数参数-base-modal)
- [属性](#属性-base-modal)
- [方法](#方法-base-modal)
- [`bricks.Modal`](#bricksmodal)
- [构造函数参数](#构造函数参数-modal)
- [属性](#属性-modal)
- [方法](#方法-modal)
- [`bricks.ModalForm`](#bricksmodalfom)
- [构造函数参数](#构造函数参数-modalfom)
- [属性](#属性-modalfom)
- [方法](#方法-modalfom)
- [注册与使用](#注册与使用)
- [示例代码](#示例代码)
---
## 概述
`bricks` 提供了一套基于布局系统的模态对话框系统:
- `BaseModal` 是所有模态组件的基础类。
- `Modal` 是一个带标题栏和内容区域的标准模态窗口。
- `ModalForm` 是一个用于展示表单的模态窗口,集成 `Form` 组件并处理提交逻辑。
- 所有模态窗口通过 Z-index 管理堆叠顺序,并支持锚点对齐(`archor`)、目标容器绑定等特性。
---
## 核心类结构
```text
bricks.Layout
└── bricks.BaseModal
├── bricks.Modal
└── bricks.ModalForm (extends PopupWindow)
```
> 注意:`ModalForm` 实际继承自 `PopupWindow` 而非 `Modal`,但功能上属于模态系列组件。
---
## `bricks.BaseModal`
基础模态类,提供通用的模态行为,如显示/隐藏、Z-index 控制、目标挂载等。
### 构造函数参数 (Base Modal)
| 参数 | 类型 | 描述 |
|------|------|------|
| `target` | `string``Layout` | 模态窗口挂载的目标容器。字符串表示 ID对象为 Layout 实例。默认为 `bricks.Body`。 |
| `auto_open` | `boolean` | 是否在添加子组件后自动打开模态。 |
| `auto_close` | `boolean` | (未启用)是否点击背景关闭模态。 |
| `org_index` | `number` | 初始 z-index 值(暂未使用)。 |
| `width` | `string` | 内容面板宽度(如 `'500px'`, `'80%'`)。 |
| `height` | `string` | 内容面板高度。 |
| `bgcolor` | `string` | 内容面板背景色,默认 `#e8e8e8`。 |
| `title` | `string` | 标题文本(仅被 `Modal` 使用)。 |
| `timeout` | `number` | 自动关闭延迟时间毫秒0 表示不自动关闭。 |
| `archor` | `string` | 锚点位置,控制内容居中方式:<br>`tl`, `tc`, `tr`, `cl`, `cc`, `cr`, `bl`, `bc`, `br`<br>默认值:`'cc'`(居中) |
### 属性 (Base Modal)
| 属性 | 类型 | 描述 |
|------|------|------|
| `panel` | `VBox` | 实际内容容器,内部垂直布局。 |
| `timeout` | `number` | 自动关闭延时ms。 |
| `timeout_task` | `Task` | 定时任务句柄,用于取消定时关闭。 |
| `target_w` | `Layout` | 解析后的目标挂载容器。 |
| `ancestor_add_widget` | `Function` | 保存父类 `add_widget` 方法的引用。 |
### 方法 (Base Modal)
#### `create()`
创建模态外层 DOM 元素:
- 使用 `<div>` 作为遮罩层。
- 设置 `position: fixed` 遮罩全屏。
- 背景颜色为半透明黑色 (`rgba(0,0,0,0.4)`)。
- 初始隐藏(`display: none`)。
- 自动分配递增的 `z-index`
#### `get_zindex() → number`
获取下一个可用的 `z-index` 值,从 `bricks.min_zindex` 开始递增。
> 默认起始值:`5000`
#### `add_widget(widget, index)`
`panel` 添加子控件。如果设置了 `auto_open: true`,则立即调用 `open()`
#### `open()`
显示模态窗口:
-`dom_element.style.display` 设为空字符串(即显示)。
- 若设置了 `timeout > 0`,启动延迟关闭任务。
- 触发 `opened` 事件。
#### `dismiss()`
关闭并移除模态窗口:
- 隐藏元素。
- 取消超时任务。
- 从父容器中移除自身。
- 触发 `dismissed` 事件。
- 异常捕获防止中断。
---
## `bricks.Modal`
标准模态对话框,继承自 `BaseModal`,带有可关闭标题栏。
### 构造函数参数 (Modal)
`BaseModal`,额外支持:
| 参数 | 类型 | 描述 |
|------|------|------|
| `title` | `string` | 显示在标题栏中的文字。 |
### 属性 (Modal)
| 属性 | 类型 | 描述 |
|------|------|------|
| `title_box` | `HBox` | 水平布局的标题栏容器。 |
| `title_w` | `Filler` | 标题文本占位容器。 |
| `content` | `Filler` | 主体内容容器,填充剩余空间。 |
### 方法 (Modal)
#### `create_title()`
创建标题栏:
- 包含一个水平盒子 `HBox`
- 左侧显示标题文本(使用 `Text` 组件,支持国际化 `i18n` 和动态尺寸 `dynsize`)。
- 右侧放置关闭图标SVG 图标,绑定 `click → dismiss()`)。
- 添加 CSS 类名 `title`
#### `add_widget(widget, index)`
将组件添加到 `content` 区域。若 `auto_open` 为真,则自动打开模态。
#### `click_handler(event)`
点击事件处理器(当前注释状态):
- 如果点击的是模态遮罩层(非内容区域),触发 `dismiss()`
- 用于实现“点击背景关闭”功能(目前未启用)。
> ⚠️ 当前该功能已被注释,需手动启用。
---
## `bricks.ModalForm`
用于快速弹出表单的模态窗口,集成异步表单构建和提交处理。
### 构造函数参数 (ModalForm)
| 参数 | 类型 | 描述 |
|------|------|------|
| `title` | `string` | 表单标题。 |
| `description` | `string` | 表单描述信息。 |
| `fields` | `Array<FieldOptions>` | 表单字段定义数组。 |
| `binds` | `Array<BindConfig>` | 数据绑定配置。 |
| `user_data` | `any` | 用户自定义数据(可选)。 |
| `submit_url` | `string` | 提交 URL可通过实例设置。 |
| 其他 | 同 `PopupWindow` | 如 `width`, `height`, `archor` 等。 |
### 属性 (ModalForm)
| 属性 | 类型 | 描述 |
|------|------|------|
| `form` | `Form` | 动态生成的表单实例。 |
| `submit_url` | `string` | 表单提交地址(可选)。 |
### 方法 (ModalForm)
#### `build_form() → Promise<void>`
异步构建表单:
- 延迟 200ms 执行(确保 DOM 就绪)。
- 使用 `bricks.widgetBuild()` 动态创建 `Form` 组件。
- 添加至模态内容区。
- 绑定以下事件:
- `submit`: 触发 `form_submit`
- `submited`: 转发服务器响应
- `cancel`: 关闭模态
- 最后调用 `open()` 显示。
#### `_getValue() → any`
获取原始表单数据(未经格式化)。
#### `getValue() → any`
获取经过验证和处理的表单数据。
#### `form_submit()`
处理表单提交:
- 获取数据并派发 `submit` 事件。
- 立即关闭模态(`dismiss()`)。
#### `form_submited(event)`
当表单成功提交后,转发 `submited` 事件及其参数。
---
## 注册与使用
```js
// 注册工厂类,便于通过字符串创建
bricks.Factory.register('Modal', bricks.Modal);
bricks.Factory.register('ModalForm', bricks.ModalForm);
```
这意味着你可以使用如下方式动态创建:
```js
let modal = bricks.Factory.create('Modal', { title: '提示', width: '400px' });
```
---
## 示例代码
### 创建一个简单模态窗口
```js
let modal = new bricks.Modal({
title: '欢迎',
width: '500px',
height: '300px',
auto_open: true,
archor: 'cc'
});
modal.add_widget(new bricks.Text({ otext: '这是模态内容!' }));
```
### 创建一个表单模态
```js
let formModal = new bricks.ModalForm({
title: '用户信息',
description: '请填写以下信息',
fields: [
{ name: 'name', label: '姓名', type: 'text' },
{ name: 'age', label: '年龄', type: 'number' }
],
binds: [
['name', 'user.name'],
['age', 'user.age']
]
});
formModal.bind('submit', function(data) {
console.log('提交数据:', data);
});
```
---
## 注意事项
1. **Z-index 管理**:所有模态共享全局 `last_zindex` 计数器,确保新窗口总在最上层。
2. **锚点定位**:依赖外部函数 `archorize(el, pos)` 实现元素定位,请确保其存在。
3. **资源路径**:关闭图标使用 `bricks_resource('imgs/delete.svg')` 加载,需正确配置资源路径。
4. **事件解绑**`click_handler` 的绑定/解绑逻辑目前被注释,如需启用请解除注释并测试。
---
## 依赖说明
- `bricks.Layout`, `bricks.VBox`, `bricks.HBox`, `bricks.Filler`, `bricks.Text`, `bricks.Svg` —— 布局与基础组件。
- `bricks.widgetBuild()` —— 异步组件构建工具。
- `schedule_once(fn, delay)` —— 延迟执行工具函数。
- `objget(obj, key, default)` —— 安全取值工具。
- `archorize(element, position)` —— 锚点定位函数。
---
**建议用途**:适用于消息提示、确认框、登录弹窗、动态表单提交等场景。
🔧 **扩展建议**
- 支持键盘 ESC 关闭。
- 添加动画过渡效果。
- 支持拖拽移动(针对 `ModalForm`)。
---
📖 *文档版本1.0*
📅 *最后更新2025年4月5日*