优维低代码:Custom Templates 自定义模板

天翎低代码表单引擎介绍 采用表单引擎工具可在不开发和新增加代码的情况下设计出新表单样式,同比程序开发可省掉程序员差不多70%的开发工作量,并且后期维护相对简单,管理方便,管理层也不会再因为项目组成员离职而头大后续的程序移交问题。编者按:本文主要介绍了天翎低代码表单引擎的功能,通过使用天翎低代码表单引擎,企业可快速实现表单功能,配置属于企业自己的功能表单。提供视图选择框、选项卡、主子表、在线编辑、二维码、拍照、视频、录音、定位等30多种功能控件。提供替换、查找、颜色、字体、等15种表单格式调整工具。一、什么是表单引擎? 阅读详情

导语

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。

连载第十六期

《高级指引:Custom Templates 自定义模板》

▽

# 背景

在较早的 Legacy Templates 构件模板中(以下称 Legacy Templates),我们定义了一种使用 JavaScript Functions 定义的构件模板,这一层抽象在一定程度上封装了复杂的构件配置。

Legacy Templates 使用函数定义,因此拥有了高度灵活的动态展开能力。但函数定义使得框架无法将它们像普通构件一样地利用起来,因此受到了诸多限制,例如模板无法享受 Provider 刷新带动更新、无法对模板绑定事件处理、无法让用户编排一个自定义模板等等。

因此有必要设计一种自定义模板(以下称 Custom Templates),它使用静态结构声明(JSON or YAML),并且拥有普通构件的所有能力,以便在 Brick Next 中编排者可以像普通构件一样去使用它们。

# 原理

Custom Templates 的定义和 Storyboard 中的构件配置基本保持一致,可以在它内部配置多个构件,并且可以为这些构件配置插槽。在系统渲染该模板时,将按模板定义展开,并维护一份模板外部与模板内部的属性和事件等的的映射关系。

模板的展开过程如下图所示:

上图中 紫色边框 表示的是 Custom Template,模板在运行时按模板的定义被展开,绿色边框 的构件是模板内部定义好的构件,展开前的模板的 tools 插槽下的 橙色边框 的构件按模板定义被移植到了 basic-bricks.micro-view 的 toolbar 插槽中。并且模板构件的属性和事件等也会按模板定义映射到相关内部构件中。

# 示例

例如一个简单的模板定义:

# A custom template definition.name: "some-package.my-custom-template"bricks:  - brick: "basic-bricks.micro-view"    properties:      pageTitle: "My Awesome Page"    slots:      content:        type: "bricks"        bricks:          - brick: "my.awesome-brick"          - brick: "my.another-brick"            events:              something.happen:                action: "console.log"

在定义好 Custom Templates 后,它们可以像普通构件一样使用:

# A storyboard partial.brick: "some-package.my-custom-template"# All lifeCycles and other configs.lifeCycle: ...

Custom Templates 可以代理内部构件的属性、事件、插槽和方法,以此实现将 Storyboard 上为该模板配置的属性和事件等映射到模板内部的指定构件上。

例如以下包含 proxy 设置的模板定义:

# A custom template definition with proxy.name: "some-package.my-custom-template"proxy:  properties:    pageName:      ref: "micro-vew"      refProperty: "pageTitle"      # Set `refTransform` instead of `refProperty`, to transform a property.      # E.g.:      #   refTransform: {      #     pageTitle: '<% `${DATA.pageName} - Awesome Page` %>'      #   }      # Tips: the transformed source data is `{ [tplPropName] : tplPropValue }`.  events:    awesome.happen:      ref: "awesome-brick"      refEvent: "something.happen"  slots:    tools:      ref: "micro-view"      refSlot: "toolbar"      # Optional `refPosition` (number):      # Insert the slotted bricks to the specified position of inner brick slot.      # If `refPosition >= 0`, counts from the start.      # If `refPosition < 0`, counts from the end.      # The `refPosition` is relative to the slotted bricks specified in template definition.  methods:    tellAwesomeStories:      ref: "awesome-brick"      refMethod: "tellStories"bricks:  - brick: "basic-bricks.micro-view"    ref: "micro-view" # Notice here! The ref id should be unique inside a custom template.    slots:      content:        type: "bricks"        bricks:          - brick: "my.awesome-brick"            ref: "awesome-brick" # And another ref.            events:              inner.happen:                # Use `targetRef` to point to another brick inside a custom template.                targetRef: "micro-view"                method: "updateView"

在 Storyboard 中使用:​​​​​​​

# A storyboard partial.brick: "some-package.my-custom-template"properties:  pageName: "My Awesome Page"events:  awesome.happen:    action: "console.log"slots:  tools:    type: "bricks"    bricks: [...]

在该 Storyboard 中:

  • 模板的pageName属性将被映射到模板内部的 micro-view 的 pageTitle 属性上;

  • 模板内部的awesome-brick触发的something.happen将触发模板的 awesome.happen 事件;

  • 模板的 tools 插槽将被装载到模板内部的 micro-view 的 toolbar 插槽中;

  • 调用模板的 tellAwesomeStories 将实际调用模板内部的 awesome-brick 的 tellStories 方法。

# 将模板的一个属性映射到多个不同的内部构件属性

有时候我们期望将模板的一个属性映射到多个不同的内部构件属性上,这时我们可以配置 extraOneWayRefs:​​​​​​​

proxy:  properties:    pageName:      ref: "micro-vew"      refProperty: "pageTitle"      extraOneWayRefs:        - ref: "button"          refProperty: "buttonName"        - ref: "link"          refProperty: "linkName"

对于以上配置,模板对外的属性 pageName 除了映射到micro-view的pageTitle上,还会同时映射到 button 和 link 的对应属性上。

注意:正如该配置的名称所说,extraOneWayRefs 是单向的,如果直接变更其内部构件的属性不会向上反馈到模板上。

# 属性合并

有时候我们希望自定义模板代理的内部构件的属性可以进行数据合并,而不是整体的属性映射。例如我们定义一个自定义模板,它内部有一个表格构件,它的 columns 初始定义了一些通用列,同时希望编排者可以按需为表格增加其它的列定义。

现已支持通过 mergeProperty 等配置即可实现属性合并,例如定义一个自定义模板:​​​​​​

name: "tpl-extensible-table"proxy:  properties:    appendColumns:      ref: "table"      mergeProperty: "columns"      mergeType: "array" # "array" or "object"      mergeMethod: "append" # "append" or "prepend" or "insertAt"      # mergeArgs: # optional args for methods like "insertAt"bricks:  - brick: "presentational-bricks.brick-table"    properties:      # Predefined default columns      columns:        - dataIndex: "id"          title: "ID"        - dataIndex: "name"          title: "Name"

编排时:​​​​​​​

bricks:  - brick: "tpl-extensible-table"    properties:      # User-defined extra columns      appendColumns:        - dataIndex: "email"          title: "Email

详细说明:

  • mergeProperty: 要合并到的内部构件的属性名。

  • mergeType:

    支持两种类型:"array" 和 "object"。

  • mergeMethod:

    当mergeType === "array"时支持三种方法: "append", "prepend", "insertAt";

    当mergeType === "object" 时只支持一种方法:"extend"。

  • mergeArgs:

    当mergeType === "array" && mergeMethod === "insertAt" 时传入一个索引位置,位置为负数时,从结尾开始计数,默认为 [ -1 ]。

注意:当使用 mergeProperty 时,属性是从模板到内部构件单向流动的,即如果直接更改内部构件的相关属性,无法影响直接从模板读取的属性。

# 属性作为内部变量

有时候我们希望可以定义一些模板实例级别的变量,模板内部的构件可以在属性、事件等地方消费这些变量。注意它和 Context 上下文 的区别,后者相当于全局变量,无法将其作用域限制在某个具体的模板的实例内部。

现已支持将指定的模板属性标记为可供内部构件引用的变量,例如定义一个自定义模板:​​​​​​​

name: "tpl-flexible-table"proxy:  properties:    # 1. 将属性标记为 `asVariable: true`。    dataIndexOfName:      asVariable: truebricks:  - brick: "presentational-bricks.brick-table"    properties:      columns:        # 2. 在求值占位符中使用 `TPL.*` 引用标记好的属性。        - dataIndex: "<% TPL.dataIndexOfName ?? 'name' %>"          title: "Name"

编排时:​​​​​​​

bricks:  - brick: "tpl-flexible-table"    properties:      dataIndexOfName: "hostname"  - brick: "tpl-flexible-table"    properties:      dataIndexOfName: "username"

⊙ NOTE

在内部构件的属性中引用 TPL.* 时,只能在构件初始时拿到其初始值,此时该属性变量相当于一个常量,当模板实例的对应属性在运行时重新赋值时,该内部构件的属性不会发生变化。另一方面,在事件回调里则始终能拿到当事件发生时、最新的 TPL.*。更多信息请参考 Context 上下中的注意事项。

# 开发

  • 运行 yarn yo;

  • 选择 a new custom template (如果没有该选项,请先执行 yarn renew 然后再从第一步开始);

  • 输入你的 Custom Template 名称;

一个新的 Custom Template 就初始化好了:​​​​​​​

// `./bricks/YOUR-PKG/src/custom-templates/YOUR-TEMPLATE.ts`import { getRuntime } from "@next-core/brick-kit";
getRuntime().registerCustomTemplate("YOUR-PKG.YOUR-TEMPLATE", {  bricks: [],  proxy: {},});

homeassistant-eloverblik:家庭助理自定义组件,显示来自eloverblik.dk的数据 口语 eloverblik组件是Home Assistant定制组件,用于监视eloverblik.dk中的电数据 自定义组件是显示eloverblik.dk中数据的非常早期的阶段。 安装 手动安装 将eloverblik文件夹复制到hass配置目录中的custom_components文件夹中。 配置eloverblik传感器。 重新启动家庭助理。 使用HACS进行安装(家庭助理社区商店) 确保已安装 。 搜索并安装eloverblik集成。 配置eloverblik传感器。 重新启动家庭助理。 配置 通过配置流程完全可配置。 进行配置->集成 添加新内容并搜索eloverblik 输入刷新令牌和计量点。 刷新令牌和计量点 从获取刷新令牌和计量点。 登录 。 计量点是您的ID 可以通过单击您的用户并选择共享数据来创建刷新令牌。 状态和属性 使用以下语法创建过去24 立即下载

相关推荐

从华为杯建模到论文录用:我的Biomedical Signal Processing and Control投稿全记录(含Latex模板与审稿人推荐技巧)

本文详细记录了作者从华为杯数学建模竞赛到Biomedical Signal Processing and Control期刊投稿的全过程,分享了如何将竞赛成果转化为学术论文的实用技巧,包括LaTeX排版中的常见陷阱与解决方案,以及审稿人推荐策略。特别提供了针对Elsevier模板的优化建议和高效回复审稿意见的方法,适合生物医学信号处理领域的研究者参考。

weixin_42549037的博客 456

【亲测免费】 Config Template Card 使用教程

Config Template Card 是一个用于 Home Assistant 的 Lovelace UI 插件,允许用户在配置中使用 JavaScript 模板。通过这个插件,用户可以动态地生成和更新 Home Assistant 的 UI 元素,从而实现更灵活和个性化的界面配置。 ## 2. 项目快速启动 ### 安装 首先,确保你已经安装了 Home Assistant 并且版本在

gitblog_00083的博客 801

永磁同步电机ADRC控制策略优化:从理论到Simulink仿真实践

本文深入探讨了永磁同步电机自抗扰控制(ADRC)策略的优化与实践。针对传统PID在动态响应、抗扰及噪声抑制方面的不足,详细解析了ADRC三大核心组件——跟踪微分器(TD)、扩张状态观测器(ESO)与非线性状态误差反馈(NLSEF)的工作原理。通过手把手的Simulink仿真教程,展示了从算法编写、模型搭建到参数整定的完整流程,并进阶实现了位置-速度双环ADRC协同控制,为高性能电机伺服系统设计提供了从理论到实践的清晰指南。

root9的博客 413

推荐开源项目:Config Template Card - 简洁高效的配置模板管理工具

在日常开发中,我们经常会遇到需要处理各种配置文件的情况,`Config Template Card` 是一个简洁且功能强大的配置模板管理工具。它旨在帮助开发者更轻松地创建、维护和共享配置模板,以提高工作效率。 ## 项目简介 `Config Template Card` 提供了一个基于 Web 的界面,允许你创建卡片式的配置模版,每个卡片可以包含多种类型的字段(文本、密码、选择列表等),并支持

gitblog_00087的博客 657

【移远EG800K-CN】从AT指令到MQTT实战:4G模块云端通信全解析

本文详细解析移远EG800K-CN 4G模块的AT指令应用与MQTT云端通信实战。从硬件连接到网络配置,再到MQTT协议的数据上报与命令接收,提供了完整的物联网通信解决方案,帮助开发者快速实现设备与云端的稳定数据交互。

o1p2q3r的博客 560

从亚稳态到流片失败:SpyGlass CDC在5G芯片设计中的避坑指南

本文深入探讨了在复杂5G芯片设计中,如何利用SpyGlass CDC工具构建高效的时钟域交叉验证流程,以避免因亚稳态问题导致的流片失败。文章结合实战经验,详细解析了从约束编写、时钟复位完整性检查到层次化验证和特殊场景处理的全过程,并强调了精准的检查约束是确保验证有效性的基石,旨在帮助设计团队安全跨越异步时钟域的雷区。

weixin_29168153的博客 446

Config Template Card:让你的Home Assistant配置更灵活

`Config Template Card` 是一个专为 [Home Assistant](https://www.home-assistant.io/) 的 [Lovelace](https://www.home-assistant.io/lovelace) 界面设计的开源插件。它允许用户在配置中使用几乎任何有效的JavaScript代码,从而极大地增强了Home Assistant的配置灵活性

gitblog_00270的博客 497

【CANoe16安装教程】亲测安装成功

CANoe16安装教程

qq_45302638的博客 2万+

Config Template Card 项目常见问题解决方案

Config Template Card 是一个开源项目,旨在为 Home Assistant 的 Lovelace UI 提供可模板化的配置卡片。它允许用户在配置中使用几乎任何有效的 JavaScript 代码。该项目主要用于扩展 Home Assistant 的功能,使得用户可以自定义和控制其智能家居系统的界面。 主要编程语言:JavaScript ## 2. 新手在使用这个项目时需要特别

gitblog_00951的博客 998

MaxENT生态位模型实战:从数据准备到论文发表的完整指南

本文提供MaxENT生态位模型从数据准备到论文发表的完整实战指南,涵盖物种分布数据处理、环境变量筛选、参数优化及结果可视化等关键步骤。特别介绍如何通过R语言进行高级建模优化,提升模型AUC值,并分享海洋生物专题研究中的数据处理技巧。适合生态学研究者快速掌握这一强大的物种分布预测工具,产出高质量研究成果。

tensor9flow的博客 303

【制作100个unity实战之2】实现一款简单的FPS游戏

你将学到: fps武器脚本 基础瞄准功能 僵尸敌人AI 巡逻范围 攻击间 搜寻半径 追击 枪声吸引周围的僵尸 击中僵直效果

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3552

Config Template Card 项目教程

``` config-template-card/ ├── devcontainer/ ├── github/ ├── vscode/ ├── src/ │ ├── eslintrc.js │ ├── gitignore │ ├── prettierrc.js │ ├── LICENSE │ ├── README.md │ ├── hacs.json │ ├── pac

gitblog_00816的博客 433

14003.xilinx系统移植

文章目录1 xilinx 系统移植 sd卡版本1.1 创建项目1.2 拷贝 *.hdf 到工程目录1.3 根据hdf文件对系统进行配置1.3.1 设置内核源码路径为本地1.3.2 设置分区的名称与大小1.4 清除本地缓存并编译成功1.5 打包生成BOOT.BIN并拷贝到sd卡1.6 问题1.7 系统启动成功1.8 配置设备树文件丰富系统外设 1 xilinx 系统移植 sd卡版本 芯片型号 ZYNQ UltraScale+ XAZU2EG ,对应厂家提供的demo板为 zu102或zu104 1.1 创建

写给自己的笔记 483

崔佧低代码开发平台,框架主界面

框架主界面 用户登录成功后,便进入到TRECA.NET 5.0(.NET敏捷开发框架)主界面。TRECA.NET 5.0目前提供四种主界面展示风格+多种皮肤搭配,分别为:Nav风格、树导航风格、Ribbon风格(默认)、横向菜单风格,用户可根据自己的实际需要与喜好进行偏好设置。 设置的方式: 1、通过配置Config.xml文件中的“MainForm”配置项为: FrmTRECAFrameworkMenu、 FrmTRECAFrameworkDevRibbon、 FrmTRECA...

qq_41614038的博客 426

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

AJax学习笔记(1)

1、概述 Web 程序最初的目的就是将信息(数据)放到公共的服务器,让所有网络用户都可以通过浏览器访问。 在此之前,我们可以通过以下几种方式让浏览器发出对服务端的请求,获得服务端的数据: (1)地址栏输入地址,回车,刷新 (2)特定元素的 href 或 src 属性 (3)表单提交 这些方案都是我们无法通过或者很难通过代码的方式进行编程(对服务端发出请求并且接受服务端返回的响应),如...

魔法革1996 1614

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

用Custom Element来实现UI组件

用Custom Element来实现UI组件 最近在做的项目是要用web component的技术来搭建一个UI库。由于之前从来没接触过前端的知识,也是趁这次机会简单的学习了解了Javascript, HTML, CSS。 Web compoenents 是在当前的web 标准下,允许你创建可重用的定制元素并且在web应用中使用它。和React, Angular框架下的前端组件不同的是,用web ...

unmuted的博客 2834

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Lovelace-Mushroom项目中的模板卡片使用指南

模板卡片是Lovelace-Mushroom项目中的一个高度自定义的卡片组件,它允许用户通过模板语法自由定义卡片的内容和样式。与普通卡片不同,模板卡片提供了极大的灵活性,开发者可以根据需求完全自定义卡片的显示内容和交互行为。 ## 核心功能特性 1. **全模板支持**:所有文本内容都支持模板语法,可以动态显示实体状态 2. **多动作支持**:支持点击(tap)、长按(hold)和双击(do...

gitblog_00586的博客 703

vue中注册了组件,但是页面依然会报错Unknown custom element

vue中注册了组件,但是页面依然会报错Unknown custom element 在父组件中导入子组件 import ‘xxx’ from ‘文件所在位置’ 在父组件中使用子组件 components:{xxx(组件名,与引入的名称相同)} 使用子组件 (1)要注意写法: 使用的时候可以使用 <xxx></xxx> 这样的形式,或者使用’-'来分割大写转变小写 // 例如注册名称为'badForm',使用的时候为 <bad-from></bad-from>

qq_45953036的博客 2623

给nz-select的nz-option设置样式

今天刚好接到一个需求要求鼠标移到nz-option上时显示option的名字的全称,原因是option的label太长导致无法显示完全 (这里遇到相同问题的话也可以考虑将ng-zorro-antd组件版本升到10,版本10会自带title属性,但是版本升级可能会产生未知的问题所以我没考虑) 这里的话还是需要用到option的自带api nzCustomContent 我的实际代码如下,定义一个自定义模板,将想要进行写的样式放在自定义模板中,这样的话除了添加title属性以外还可以做更多的拓展,即使数据

smallNut的博客 3295

select 实现搜索功能_[Angular 组件库 NG-ZORRO 基础入门] - 源码初窥: Select - 2

前言回顾目前我们已经了解了 nz-select 组件的基本设计结构,我们昨天已经知道了 nz-select 被拆分为:nz-select-top-control / nz-option-container / nz-option 等部分,我们继续来了解一下其实现过程。组件模块NzSelectTopControlComponent我们先看一下 nz-select-top-control.compon...

weixin_39957951的博客 836

vue报错 Unknown custom element,未知的自定义元素

[Vue warn]: Unknown custom element: - did you register the component correctly? For recursive components, make sure to provide the “name” option. 未知的自定义元素: - 您是否正确注册了组件? 对于递归组件,请确保提供“名称”选项。 错误路径 found in —> at src/views/employees/index.vue 如果你用一定组件,全

weixin_57246351的博客 9345

vue 报错unknown custom element解决方法

原因:   没有引入相关组件导致的 解决办法: 如果组件是按需引入的必须引入你当前用到的组件,否则会报错 转载于:https://www.cnblogs.com/wangtao-/p/10238559.html...

weixin_30481087的博客 4540

自定义组件使用时出错Unknown custom element:

错误:Unknown custom element: <xxxx> - did you register the component correctly? For recursive components, make sure to provide the "name" option. 是否出现两个组件相互调用 如: A.vue 中 import Bfrom xxxx 在B.vue 中 import A from xxx ...

qq_41722795的博客 541

报错Unknown custom element: <组件名> - did you register the component correctly?的原因及解决办法

报错Unknown custom element: <组件名> - did you register the component correctly?的原因及解决办法

chelflan's blog 11万+

使用ngZorro中Upload自定义上传时XMLHttpRequest问题解决方法

使用ngZorro中Upload自定义上传时XMLHttpRequest问题解决方法 使用angular框架写前端的用户一般都比较喜欢用ngZorro,本人最近在使用ngZorro中的Upload自定义文件组件(链接:ngZorro自定义上传)上传时遇到如下问题。 问题描述: 该组件实例代码 import { HttpClient, HttpEvent, HttpEventType, HttpR...

My_Soul_的博客 4279
上一篇: DevOps 的未来:值得关注的趋势
下一篇: 优维EasyOps®全平台又一波新功能上线,操作体验更带劲
优维科技EasyOps
博客等级 码龄5年 1483粉丝 395原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值