# `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` | 锚点位置,控制内容居中方式:
`tl`, `tc`, `tr`, `cl`, `cc`, `cr`, `bl`, `bc`, `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 元素:
- 使用 `
` 作为遮罩层。
- 设置 `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` | 表单字段定义数组。 |
| `binds` | `Array` | 数据绑定配置。 |
| `user_data` | `any` | 用户自定义数据(可选)。 |
| `submit_url` | `string` | 提交 URL(可通过实例设置)。 |
| 其他 | 同 `PopupWindow` | 如 `width`, `height`, `archor` 等。 |
### 属性 (ModalForm)
| 属性 | 类型 | 描述 |
|------|------|------|
| `form` | `Form` | 动态生成的表单实例。 |
| `submit_url` | `string` | 表单提交地址(可选)。 |
### 方法 (ModalForm)
#### `build_form() → Promise`
异步构建表单:
- 延迟 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日*