yi/utter

通道:初始化


Methods

(static) yiAssist(reference, state) → {Promise.<T>}

「通道」Ex.yiAssist

1. 输入来源

来源 含义
cab/<LANG> 资源目录cab/<LANG>/中绑定的资源文件的_assist节点,使用@zero绑定。
config 直接从props中读取配置,消费assist节点,这种通常是配置型。

2. 辅助数据种类

示例中的数据结构直接从_assist开始,或config.assist开始,它包含了多个键值配置,每个配置如下:

节点 含义
uri Ajax远程方法的Uri地址。
method 默认GET,可修改成其他方法来读取。
magic 新版查询模式,非查询引擎,直接将magic节点佐为查询条件。
params.criteria 这种通常是qr=true,设置查询引擎。
qr (Boolean)是否强制性使用查询引擎,强制使用则会触发后端查询引擎。
response 配置响应数据的特殊属性,主要用来配置记录主键。
group 这个配置目前仅用于X_TABULAR读取,根据某个字段进行分组,然后使用值构造变量。

2.1. 非X_TABULAR类型

这种类型比较自由,读取任意接口或任意表都可以。

{
     "model.information": {
         "uri": "/api/model/full/read",
         "response": {
             "key": "id"
         }
     },
     "model.resource":{
         "uri": /api/model/resource"
     }
}

上边的配置信息会在state中生成两个变量,这种模式的变量名直接根据配置中的Object属性字段来定义。

  • $a_model_information
  • $a_model_resource

2.2. X_TABULAR类型

这种类型只读取X_TABULAR的数据类型,而且会提供group方法执行分组,通常是TYPE字段。

{
     "tabular": {
         "uri": "/api/types/tabulars",
         "method": "POST",
         "magic": {
             "$body": [
                 "zero.authority",
                 "member.card"
             ]
         },
         "group": "type"
     }
}

上边配置生成的变量为:

  • $t_zero.authority
  • $t_member_card

3. Js脚本

3.1. 调用代码

框架内部的调用代码如下:

import Ex from 'ex';

const state = {};
Ex.yiAssist(reference, state).then(response => {
    // response 变量中会包含执行 assist 辅助数据流程后的变量
    // 假设使用了 2.1 和 2.2 的综合配置
    // 则会生成下边四个属性
    // - $a_model_information,数据类型是 DataArray
    // - $a_model_resource,数据类型是 DataArray
    // - $t_permission_type,数据类型是 DataArray
    // - $t_member_card,数据类型是 DataArray
})

3.2. 提取数据代码

import Ux from 'ux';

// 直接传入原始key,会直接做转换
// member.card,系统会检索读取上述列表中的 $t_member_card 变量的值
// 返回值为 Array 类型。
const memberCard = Ux.onDatum(reference, "member.card");

3.3. Datum函数

除开直接读取的onDatum以外,还可以使用一些带有Datum关键字的函数,例如:

Datum函数 纯函数
elementFindDatum elementFind
elementUniqueDatum elementUnique
elementGroupDatum elementGroup

Datum的函数会比纯函数多两个参数,前两个参数就是onDatum的两个参数,简单说是Datum遵循如下代码执行流程:

步骤 执行代码
1 输入referencesourceKey(上述调用代码第二参)。
2 调用onDatum抽取函数,生成数据(Array类型)。
3 执行主方法,纯函数中的方法,以Array数据为基础。
Parameters:
Name Type Description
reference Object | ReactComponent

React对应组件引用

state Object | State

输入状态,计算之前的

Returns:

执行更新过后的状态,计算之后的

Type
Promise.<T>

(static) yiColumn(reference, initState, $data) → {*}

Deprecated:
  • Yes

「通道」Ex.yiColumn

同 yiListLazy

Parameters:
Name Type Description
reference
initState
$data
Returns:
Type
*

(static) yiCombine(reference, extension) → {*}

「通道」Ex.yiCombine

Parameters:
Name Type Description
reference
extension
Returns:
Type
*

(static) yiContainer(reference) → {Promise.<T>}

「通道」Ex.yiContainer

1. 基本介绍

模板处理种类

  1. 静态模板
  2. 动态模板

动态模板判断

判断$dynamic的依据和条件:

  1. $router 中的 path 路径以:/ui/ 开头
  2. $router 中的参数同时包含:module / page

最终返回

{
    app: "应用名",
    module: "模块名",
    page: "页面名"
}
  • $container:容器配置
  • $component:内部组件配置

渲染计算

$dynamic:

  • = true:动态渲染,Ox Engine
  • = false:静态渲染,Zero UI

2. 动态执行逻辑

这是Extension扩展中动态渲染模板的基础,最终都是为了改变当前组件中的state结构。

2.1. 路由解析

调用_seekRoute解析react-router相关信息,构造完成后状态如下:

{
    $input: {
        app,
        module,
        page
    },
    $dynamic: "(Boolean)是否执行动态渲染",
    $secure: "(Boolean)是否安全页面(鉴权)"
}

如果是动态页面,参数$input直接来自于路由和环境变量的计算:

参数 来源 含义
app 环境变量Z_ROUTE 当前应用的专用路由(标识应用程序)。
module $router变量 当前页面所属模块。
page $router变量 当前页面名称。

2.2. 异步初始化

调用startAsync函数,初始化状态信息,完成后结构如下:

{
    $tpl: {},
    $container: {},
    $grid: {},
    $assist: {},
    $controls: {}
}
属性名 含义
$tpl 模板详细数据信息。
$container 容器配置信息。
$grid 生成的网格布局基础配置。
$assist 需使用的辅助数据定义。
$controls 所有当前页面需要的控件配置信息。
$secure 后期追加,页面是否执行鉴权。

2.2. 模块配置

调用yiModule函数执行模块初始化(略)。

2.3. 页面配置

使用模块中存在的data.$input作为入参,读取页面配置信息,页面配置包括容器/组件双配置。

2.4. 页面规范化

调用_seekPage函数执行页面配置初始化,从$output对象中抽取数据信息:

  1. 根据$output.layout重写状态中的state.$tpl模板信息。
  2. 若包含$output.containerName则重写状态中state.$container容器信息。
  3. 页面组件解析:
    1. 解析$output.secure属性,追加state.$secure属性。
    2. 读取$output.grid网格布局属性,重写state.$grid属性。
    3. 读取$output.assist辅助数据定义,重写state.$assist属性。
    4. 读取$output.controls配置数据,重写state.$controls属性。

3. 最终状态

执行完上述方法后的最终状态如(示例模板):

{
    $input:{
        app: "所属应用",
        module: "所属模块",
        page: "所属页面"
    },
    $output: "(输出)远程读取配置的基础数据",
    $dynamic: "(Boolean)是否动态渲染",
    $secure: "(Boolean)是否安全页面",
    $tpl: "使用模板的详细配置",
    $container: "容器相关配置",
    $grid: "网格布局基础信息",
    $assist: "辅助数据定义信息",
    $controls: "当前控件的所有配置信息"
}

状态中的数据存储是定义好的元数据信息,包括配置数据,其目的是为了让真正执行过程中的方法可根据这些数据对页面渲染进行计算。

Parameters:
Name Type Description
reference Object | ReactComponent

React对应组件引用

Returns:

执行更新过后的状态

Type
Promise.<T>

(static) yiControl(argumentsopt) → {Promise.<T>}

「通道」Ex.yiControl

1. 基本介绍

控件专用处理,从后端读取配置:UI_CONTROL / UI_FORM / UI_LIST

  1. 单参,直接提取控件配置,调用yoControl执行容器和组件的配置规范化(container/component)。
  2. 双参,根据control和类型type执行控件配置提取(包括Form和List)
    1. 根据控件ID(control)和类型(type)读取基本配置和操作配置。
    2. 在响应信息中为操作注入ACL安全配置信息__acl
    3. 再执行parseControl方法执行控件配置规范化(主要针对操作)

2. 使用场景

该函数仅位于控件配置预初始化专用流程。

Parameters:
Name Type Attributes Description
arguments arguments <optional>

可选参数,变参

Returns:

返回最终的 Promise。

Type
Promise.<T>

(static) yiListLazy(reference, initState, $data) → {Promise.<T>}

「通道」Ex.yiListLazy

1. 基本介绍

列渲染专用处理函数,用于处理USER特殊类型的$render执行数据预处理

  1. 提取所有USER列相关信息。
  2. 根据传入数据执行$lazy的计算(预处理Ajax,系统中唯一调用Ux.ajaxEager的位置。

这种类型的代码流程如下:

步骤 含义
1 扫描表格配置table中的columns节点。
2 columns节点中抽取$render = USER的列类型。
3 收集所有这种类型,执行单独的参数合并,数据条目的读取和辅助数据读取请求不对等,可能10条数据由于某个字段值一样只读取四次。
4 构造state中的$lazy变量:一个Object类型。

2. 关于$lazy的结构

2.1. 数据

[
     { "type": "type1", "name": "记录1" },
     { "type": "type1", "name": "记录2" },
     { "type": "type1", "name": "记录3" },
     { "type": "type2", "name": "记录4" },
     { "type": "type2", "name": "记录5" },
     { "type": "type2", "name": "记录6" }
]

2.2. 辅助数据

[
     { "key": "type1", "name": "类型1" },
     { "key": "type2", "name": "类型2" }
]

2.3. 最终生成的变量

{
    "type":{
         "type1": "类型1",
         "type2": "类型2"
    }
}
  • 上述结构中type是数据记录中的属性。
  • Object中的数据就是type对应的:值 = 显示文字的Map字典。
Parameters:
Name Type Description
reference Object | ReactComponent

React对应组件引用

initState Object | State

返回当前组件状态

$data Array

搜索的最终结果,$data.list 中包含数据

Returns:

执行更新过后的状态

Type
Promise.<T>

(static) yiListOp(reference, config, state)

「通道」Ex.yiListOp

Parameters:
Name Type Description
reference
config
state

(static) yiListOptions(reference, config) → {*}

「通道」Ex.yiListOptions

Parameters:
Name Type Description
reference
config
Returns:
Type
*

(static) yiListPlugin(reference, config)

「通道」Ex.yiListPlugin

Parameters:
Name Type Description
reference
config

(static) yiListQuery(reference, query) → {*}

「通道」Ex.yiListQuery

Parameters:
Name Type Description
reference
query
Returns:
Type
*

(static) yiListSynonym(reference, config, state) → {*}

「通道」Ex.yiListSynonym

Parameters:
Name Type Description
reference
config
state
Returns:
Type
*

(static) yiListTab(reference, config)

「通道」Ex.yiListTab

Parameters:
Name Type Description
reference
config

(static) yiListTable(reference, config, state)

「通道」Ex.yiListTable

Parameters:
Name Type Description
reference
config
state

(static) yiListView(reference, config, state)

「通道」Ex.yiListView

Parameters:
Name Type Description
reference
config
state

(static) yiModule(reference, state, standard) → {Promise.<T>}

「通道」Ex.yiModule

1. 基本介绍

一个 module 的配置信息来源于三部分:

  1. UI.json:静态配置,会在 reference 中生成 $hoc 变量
  2. 远程的 UI_MODULE中的 metadata 字段
    • (默认值)最初的 metadata 字段为 FILE 模式(即文件路径)
    • (动态管理)如果管理过程中执行了更新,那么直接就是 metadata 的内容
  3. 如果 standard = false 那么不考虑 $hoc 的生成,而是直接使用 hoc 变量
    • 这种情况不引入 HocI18r 同样不引入 HocI18n 两个数据结构
  4. 如果 standard = true 那么有两种可能
    • 已经绑定过 UI.json,则使用混合模式(远程优先)
    • 未绑定过 UI.json,则直接使用远程模式

2. 模块读取

根据路径直接读取,路径中包含三部分,如:

/ox/ci/search
{
    app: "ox",
    module: "ci",
    page: "search"
}

src/components/ci/search代码目录中。

Zero Ui中定义的应用维度主要分三层

  1. app:应用层,依靠Z_ROUTE的环境变量规划不同的应用,多应用区分。
  2. module:模块,src/components目录下的第一层目录,上述的ci目录。
  3. page:页面,src/components目录下的第二层目录,上述的search目录。

3. 配置对象

Zero Ui中的配置对象有两种类型:HocI18nHocI18r两种,这两种数据对象的函数是一样的,但类型不同,也就是说 这两个对象在调用配置读取的API如Ux.fromHocUx.fromPath时会维持一致。

当前函数会读取X_MODULE的配置数据信息,如果存在,则和Cab.json的资源文件中的配置进行合并,生成最终的配置对象。

  • 远程数据存储于HocI18r
  • 本地资源配置存储于HocI18n
  • 本地和远程同时执行时候,直接读取metadata构造附加的hoc配置数据。
Parameters:
Name Type Description
reference Object | ReactComponent

React对应组件引用

state Object | State

返回当前组件状态

standard boolean

是否执行标准化

Returns:

执行更新过后的状态

Type
Promise.<T>

(static) yiPartForm(ref, config, inherit) → {Object}

「通道」Ex.yiPartForm

1. 基本介绍

初始化表单配置的专用方法,等价于yiForm,旧版本有一个yiForm方法,为了兼容原始方法,所以独立了 另外一个方法yiPartForm来实现表单初始化。

该方法执行流程如下:

  1. 先从绑定的资源文件cab/<LANG>/中读取_form节点中的配置信息。
  2. inherit用于判断React引用是使用传入引用,还是传入引用的父引用。

2. 标准化配置

调用Ux.configForm对表单数据进行配置(同步流程),这个步骤需要完成以下几点:

  • 从配置中读取renders对象用于配置key = Jsx的表单字段(开发用来渲染表单字段专用)
  • 构造状态state中的$onChange函数
  • config中的变量state作为附加值合并到reference的状态中

3. config参数

config参数中的核心结构如下:

{
    renders: {},
    onChange: {}
}
变量 类型 含义
renders Object field = Jsx结构,渲染表单时对应的字段渲染函数。
onChange Object field = Function结构,对象中的每个函数可以注入到字段的onChange外置函数中。
Parameters:
Name Type Default Description
ref Object | ReactComponent

React组件引用

config Object

和表单相关的基本配置

inherit Object | Boolean true

将要继承到表单中的属性信息

Returns:
Type
Object

(static) yiStandard(reference, inputState) → {Promise.<T>}

「通道」Ex.yiStandard

1. 基本介绍

标准核心模块专用方法,内部调用函数

  1. yiModule
  2. yiAssist
  3. yiParameters

2. yiParameters

yiModuleyiAssist可直接参考文档中的做法,yiParameters用于处理路由中的参数, 构造reference.state中特定的$query变量。

  1. $router中读取核心参数typestatus
  2. 如果构造的条件超过1个,使用AND连接符。
参数 含义
type 广义的类型参数。
status 广义的状态参数。

上述读取参数可位于路径中,也可位于查询字符串中,如/uri/xxx/:p1?p2=v2p1p2都是合法参数。

Parameters:
Name Type Description
reference Object | ReactComponent

React对应组件引用

inputState Object | State

返回当前组件状态

Returns:

执行更新过后的状态

Type
Promise.<T>