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

304 lines
7.9 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.Tabular` 技术文档
```markdown
# bricks.Tabular 类文档
`bricks.Tabular` 是一个基于 `bricks.DataViewer` 的表格数据展示组件,用于在 Web 界面中以表格形式渲染结构化数据。它支持行选择、复选框状态变更监听、动态内容展开(折叠面板)、字段过滤等功能,适用于需要交互式表格的前端应用场景。
---
## 继承关系
- **继承自**`bricks.DataViewer`
- **注册名称**`Tabular`(通过 `bricks.Factory.register` 注册)
---
## 构造函数
```js
constructor(opts)
```
### 参数
- `opts` (Object) - 配置选项,传递给父类 `DataViewer` 并用于初始化当前实例。
### 说明
调用父类构造函数后,绑定 `row_check_changed` 事件,触发时执行 `show_check_event_data` 方法(需确保该方法存在或已定义)。
> ⚠️ 注意:`this.show_check_event_data.bind(this)` 表明此方法应在外部实现或混入。
---
## 核心方法
### `async build_other()`
在数据构建阶段调用,用于初始化编辑字段。
#### 功能
调用 `get_edit_fields()` 方法,提取可编辑字段列表并存储到 `this.fields` 中。
---
### `async before_data_handle()`
在处理数据前异步执行的钩子函数。
#### 功能
1. 调用 `build_header_row()` 创建表头行;
2. 设置数据偏移量为 1可能用于跳过表头占位
#### 属性设置
- `this.data_offset = 1`
---
### `async build_header_row()`
创建并渲染表格的表头行。
#### 实现逻辑
1. 合并配置项:将 `cheight``row_options` 扩展为新的 `options`
2. 创建 `DataRow` 实例作为表头;
3. 渲染但不立即插入内容(`render(false)`
4. 添加 CSS 类名 `tabular-header-row`
5. 将其添加至滚动容器 `scrollpanel`
#### 示例代码
```js
var dr = new bricks.DataRow(options);
dr.set_css('tabular-header-row');
this.scrollpanel.add_widget(dr);
```
---
### `async build_record_view(record)`
根据记录数据构建单条记录的视图。
#### 参数
- `record` (Object) - 数据记录对象。
#### 返回值
- `Promise<Widget>` - 返回包装后的行控件VBox 或 DataRow
#### 分支逻辑
| 条件 | 行为 |
|------|------|
| `!this.content_view` | 直接返回 `DataRow`,绑定点击事件 |
| `this.content_view` | 使用 `VBox` 包裹主行和隐藏的内容区,支持展开/折叠 |
##### 内部结构(含 content_view 时)
- 主显示区域:`row.rec_widget`
- 折叠内容区域:`row.content_widget`(初始隐藏)
- 存储原始数据:`row.user_data = record`
##### 事件绑定
- 点击主行触发 `record_clicked(row, record, event)`
---
### `async record_clicked(row, record, event)`
处理行点击事件,实现单选高亮与内容展开控制。
#### 参数
- `row` - 当前行控件(可能是 `DataRow``VBox`
- `record` - 对应的数据记录
- `event` - 原生事件对象
#### 功能
1. 取消上一个选中行的高亮样式;
2. 若启用了 `content_view`,则关闭旧行的内容区;
3. 切换当前行为选中状态:
- 更新 `this.select_row`
- 显示高亮样式
- 如启用 `content_view`,调用 `toggle_content(true)` 展开内容
4. 触发 `row_selected` 事件,携带当前记录数据。
---
### `async toggle_content(row, flag)`
控制某一行的折叠内容区域的显示或隐藏。
#### 参数
- `row` (VBox) - 包含 `.content_widget` 的行容器
- `flag` (Boolean) - `true` 展开,`false` 收起
#### 行为
- `flag === true`:
- 显示内容区
- 清空现有子控件
- 复制 `this.content_view` 描述结构
- 应用当前行数据进行模板填充
- 异步构建新控件并插入
- `flag === false`:
- 隐藏内容区
- 清除所有子控件
> ✅ 支持动态内容渲染,常用于详情展示、表单嵌套等场景。
---
### `get_edit_fields()`
提取可用于编辑的字段列表,排除指定字段。
#### 参数来源
- `this.row_options.fields`: 字段定义数组
- `this.row_options.editexclouded`: 排除字段名数组(拼写疑似错误,应为 `excluded`
#### 流程
遍历所有字段,若字段名不在 `editexclouded` 列表中,则加入 `this.fields` 数组。
> ❗ 注意:`editexclouded` 拼写异常,建议检查是否应为 `editExcluded` 或类似命名。
---
### `async build_info(record)`
构建单条数据行的显示控件(`DataRow`)。
#### 参数
- `record` (Object | null) - 数据记录;若为空表示构建表头
#### 配置合并
使用 `bricks.extend` 合并默认高度与行选项。
#### 渲染逻辑
- 设置 CSS 类名为 `tabular-row`
- 调用 `dr.render(header)` 控制是否渲染为表头
- 绑定 `check_changed` 事件 → `record_check_changed`
> 🔤 注释掉的部分涉及工具栏事件代理,目前未启用。
---
### `record_check_changed(event)`
处理复选框状态变化事件。
#### 行为
1. 保存最后变更的行到 `this.check_changed_row`
2. 派发 `row_check_changed` 事件,携带用户数据
#### 派发事件
- 事件名:`row_check_changed`
- 参数:`event.params.user_data`
---
### `async renew_record_view(form, row)`
更新指定行的数据视图(如编辑后刷新显示)。
#### 参数
- `form` - 表单控件实例,用于获取最新值
- `row` - 要更新的行控件
#### 步骤
1. 获取表单数据:`form._getValue()`
2. 合并到原记录:`bricks.extend(row.user_data, d)`
3. 调用 `renew(record)` 更新 UI
- 若有 `content_view`:仅更新主显示部分 `rec_widget`
- 否则:直接更新整行
---
### `record_event_handle(event_name, record, row, item)`
通用事件处理器,用于转发来自 `DataRow` 工具栏的操作事件。
#### 参数
- `event_name` - 事件类型字符串
- `record` - 当前行数据
- `row` - 行控件实例
- `item` - 触发事件的具体元素(如按钮)
#### 行为
打印日志,并派发对应事件,携带 `record` 数据。
> 📝 日志输出便于调试,生产环境可考虑移除或降级。
---
### `get_hidefields()`
生成隐藏字段数组,通常用于向后端提交额外参数。
#### 返回值
- Array<{name, value, uitype}>: 每个字段设置 `uitype: 'hide'`
#### 数据源
`this.data_params` 对象提取键值对,转换为字段格式。
#### 示例输出
```js
[
{ name: "user_id", value: 123, uitype: "hide" },
{ name: "mode", value: "preview", uitype: "hide" }
]
```
---
## 事件系统
| 事件名 | 触发时机 | 携带参数 |
|-------|---------|--------|
| `row_check_changed` | 行复选框状态改变 | `record`(用户数据) |
| `row_selected` | 用户点击某行 | `record`(用户数据) |
| (转发)任意 `event_name` | 来自 `DataRow.toolbar_w` 的事件 | `record` |
---
## 样式类说明
| CSS 类名 | 用途 |
|--------|------|
| `tabular-header-row` | 表头行样式 |
| `tabular-row` | 普通行样式 |
| `tabular-row-selected` | 选中行高亮样式 |
---
## 工厂注册
```js
bricks.Factory.register('Tabular', bricks.Tabular);
```
允许通过描述符 `{type: 'Tabular', ...}` 动态创建实例。
---
## 使用示例(伪代码)
```js
var tabular = new bricks.Tabular({
cheight: 30,
row_options: {
fields: [
{ name: 'name', label: '姓名' },
{ name: 'age', label: '年龄' }
],
editexclouded: ['age'] // age 不参与编辑
},
content_view: {
type: 'Form',
items: [
{ field: 'detail', uitype: 'textarea' }
]
}
});
tabular.bind('row_selected', function(data) {
console.log('Selected:', data);
});
// 加载数据
tabular.setData(records);
```
---
## 注意事项
1. **拼写问题**`editexclouded` 应为 `editExcluded``excludedFields`,建议修正。
2. **依赖项**:依赖 `bricks.DataRow`, `bricks.VBox`, `bricks.widgetBuild`, `objcopy`, `bricks.apply_data` 等模块,请确保已加载。
3. **异步安全**:多数方法标记为 `async`,调用时需使用 `await`
4. **事件解绑**:未见销毁生命周期管理,长期运行可能导致内存泄漏。
---
```