当前位置: 首页 > news >正文

优维低代码:Placeholders 占位符

导语

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


连载第十九期

《高级指引:Placeholders 占位符

在 transform 及参数注入中我们都引入了 placeholder 占位符语法,它提供了在静态 storyboard 中访问及处理动态数据的能力。

# 示例

例如以下 transform 配置片段(yaml):

transform:  url: '?query=@{ some.field[0].path = ["complex","value"] | map : instanceId | slice : 0 : 10 }'

字段 url 中被 @{ ... } (在参数注入中为 ${ ... })包裹的部分就是占位符,它们将在运行时根据上下文信息计算得到。

以上 url 可以被分解为以下结构:​​​​​​​

- RawString: "?query="- Placeholder:    field: "some.field[0].path"    default:      value: ["complex", "value"]    pipes:      - identifier: map        parameters:          - "instanceId"      - identifier: slice        parameters:          - 0          - 10

在运行时,Placeholder 将根据上下文按以下流程计算得到结果:

  1. 使用 _.get(context, field) 得到 result;

  2. 如果 result 为 undefined,那么将 default.value 赋值给 result;

  3. 遍历 pipes,通过 identifier 找到对应的管道函数 pipe,将 result 作为第一个参数,parameters 作为额外参数列表,调用 pipe 并将返回值赋值给 result;

  4. 返回 result。

请参考 Pipes 管道。

而最终 url 得到的值为所有 RawString 与 Placeholder 计算得到的值通过 Array#join 拼接后的结果。

注意:Array#join 如果遇到 undefined, null 或空数组 [] 的元素,将被转换为空字符串。

注意:当某个字段仅由单个 Placeholder 组成时,将返回它原始计算得到的值,而不是 Array#join 的结果。

# 细节

在 default 默认值及 pipe parameters 管道参数语法中,可以使用 JSON value 的格式传递各种形式的值。同时为了能简化普通字符串的编写,如果要设置的值不会和 JSON value 格式冲突、且不包含特殊控制字符(|:})和空白符的字符串时,可以直接填写字面量的字符串,例如 ${QUERY.objectId=HOST}。系统在以下情况中将认为该值为 JSON value 并进行相应解析(即使解析失败):

  • 系统认为可能是数组、对象、数字类型的,即以 [ { " 或数字开头的、或以 - 开头并跟着至少一个数字的;

  • 完全等于 null false true 的。

其它情况将按 literal-string 字面量字符串解析。

注意,literal-string 仅能使用英文字母、数字、_、- 和 non-ascii 字符(即可以使用包括中文在内的其它字符)。field 除了上述字符外,还可以使用 .、*、[、]。

# 图解

ws: 和 JSON 定义里的 whitespace 一致,即空字符串或连续的空白字符。

相关文章:

  • Qt中QLayout的用法(QGridLayout, QFormLayout, QStackedLayout)
  • LVGL实现按钮互斥效果
  • PX4模块设计之二十八:RCInput模块
  • windows10安装蓝牙驱动方法步骤
  • SQL语句如何避免在mysql插入重复数据
  • JsonSchema 转换为 Typescript
  • 【区块链 | OpenZeppelin】手把手交易使用OpenZeppelin Upgrades部署可升级智能合约
  • 同一公司开发的多个软件,可以用同一张代码签名证书吗?
  • 深度分析:用户最喜欢用哪种NFT做头像
  • php 小数计算 结果变无限小数解决方案
  • WebRTC研究:丢包与抖动
  • freeswitch的3XX重定向
  • jsp+sql毕业生招聘系统免费系统+论文
  • Java毕业设计-火车订票管理系统
  • SwiftUI 界面状态 成员变量 @State @Buiding immutable
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【面试系列】之二:关于js原型
  • express如何解决request entity too large问题
  • Invalidate和postInvalidate的区别
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java,console输出实时的转向GUI textbox
  • Java编程基础24——递归练习
  • js面向对象
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • storm drpc实例
  • 关于使用markdown的方法(引自CSDN教程)
  • 缓存与缓冲
  • 每天一个设计模式之命令模式
  • 那些被忽略的 JavaScript 数组方法细节
  • 物联网链路协议
  • 以太坊客户端Geth命令参数详解
  • #APPINVENTOR学习记录
  • #define用法
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2)空速传感器
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (四) 虚拟摄像头vivi体验
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ******之网络***——物理***
  • .a文件和.so文件
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 事件模型教程(二)
  • .NET开发不可不知、不可不用的辅助类(一)
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @Resource和@Autowired的区别
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [20171106]配置客户端连接注意.txt
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序