跳转到内容

树容器刷新节点

分栏布局及树容器交互

描述

树容器的基础实践,本文描述了以下场景

  1. 在树节点上操作成功后如何刷新父节点信息
  2. 在分栏结构下详情中操作后如何刷新树节点信息

基本布局

树容器 xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明 pageId 用于查找原页面 -->
<View title="指标" pageId="TreeContainer" forModel="partner_IndicatorBO" name="指标" menuView="true" type="List" version="2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://trantor-docs-dev.app.terminus.io/static/v0.18.x/schema/base.xsd">
<Tree key="TreeKey" model="partner_IndicatorBO" onSelect="onSelectedMethod" searchable="#{true}" depthLimit="4" parentField="parent">
<Fields>
<Field name="name"/>
</Fields>
<Actions>
<!-- 创建一级节点按钮 -->
<Action type="Create" targetView="createModalViewKey" openViewType="Dialog" openViewSize="s"/>
</Actions>
<RecordActions>
<Action key="onSelectedMethod" openViewType="Columns" env="#{{id:this.record.id}}" targetView="partner_IndicatorBO_IndicatorDetail"/>
<!-- 删除当前节点 -->
<Action type="Delete" confirm="确认删除?" logicFunc="xxxxxx" after="#{afterDelete}"/>
<!-- 创建子节点 -->
<Action type="Create" targetView="createNodeView" label="创建子节点" openViewType="Dialog" />
</RecordActions>
</Tree>
</View>

树容器 ts

import {Controller} from '@terminus/nusi-sdk'
export default class extends Controller {
}

createNodeView 新建节点弹窗xml

<?xml version="1.0" encoding="UTF-8"?>
<View title="创建节点" forModel="partner_IndicatorBO" menuView="true" type="Form" version="2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://trantor-docs-dev.app.terminus.io/static/v0.18.x/schema/base.xsd">
<Form model="modelKey">
<Fields>
<Field name="name"/>
<Field name="othor"/>
</Fields>
<Actions>
<Action type="Cancel" action="Close" />
<!-- 创建后去刷新树节点 -->
<Action type="Submit" logicFlow="flowKey" after="#{() => afterRefresh(pageRecord)}" label="提交"/>
</Actions>
</Form>
</View>

createNodeView 新建节点弹窗 ts

import {Controller} from '@terminus/nusi-sdk'
export default class extends Controller {
afterRefresh = (node) => {
const page = this.getSourceView('TreePage')
// 新增刷新父节点的父节点
page.getContainerByKey('TreeKey').refresh(node.parent?.id)
// 关闭弹窗
this.closePage()
}
}

节点详情 xml

<?xml version="1.0" encoding="UTF-8"?>
<View title="创建节点" forModel="partner_IndicatorBO" menuView="true" type="Form" version="2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://trantor-docs-dev.app.terminus.io/static/v0.18.x/schema/base.xsd">
<Detail model="modelKey">
<Fields>
<Field name="name"/>
<Field name="othor"/>
</Fields>
<Actions>
<!-- 创建下级节点按钮 -->
<Action type="Create" targetView="createNodeView" record="#{pageRecord}" openViewType="Dialog" label="新建" />
<!-- 删除当前节点 -->
<Action type="Delete" logicFlow="flowKey" confirm="确认删除吗?" after="#{() => afterRefresh(pageRecord)}" label="删除"/>
<!-- 更新操作,需要刷新当前详情页,以及刷新树节点 -->
<Action logicFlow="flowKey" after="#{() => updateAndRefresh(pageRecord)}" label="更新状态"/>
<!-- 弹窗后操作更新 -->
<Action targetView="updateNodeModal" record="#{pageRecord}" openViewType="Dialog" label="更新信息"/>
</Actions>
</Detail>
</View>

节点详情 ts

import {Controller} from '@terminus/nusi-sdk'
export default class extends Controller {
afterRefresh = (node) => {
const page = this.getSourceView('TreePage')
// 新增刷新父节点
page.getContainerByKey('TreeKey').refresh(node.parent?.id)
}
updateAndRefresh = (node) => {
const page = this.getSourceView('TreePage')
// 新增刷新父节点
page.getContainerByKey('TreeKey').refresh(node.parent?.id)
// 关闭弹窗
this.closePage()
}
}

updateNodeModal 详情更新弹窗 xml

<?xml version="1.0" encoding="UTF-8"?>
<View title="更新节点弹窗" forModel="partner_IndicatorBO" menuView="true" type="Form" version="2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://trantor-docs-dev.app.terminus.io/static/v0.18.x/schema/base.xsd">
<Form model="modelKey">
<Fields>
<Field name="name"/>
<Field name="othor"/>
</Fields>
<Actions>
<Action type="Cancel" action="Close" />
<!-- 创建后去刷新树节点 -->
<Action type="Submit" logicFlow="flowKey" after="#{() => updateAndRefresh(pageRecord)}" label="提交"/>
</Actions>
</Form>
</View>

createNodeView 详情更新弹窗 ts

import {Controller} from '@terminus/nusi-sdk'
export default class extends Controller {
updateAndRefresh = (node) => {
const page = this.getSourceView('TreePage')
// 新增刷新父节点的父节点
page.getContainerByKey('TreeKey').refresh(node.parent?.id)
// 回退到详情页并更新
this.goBack()
}
}