当前位置: 首页 > 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
  • 分享的文章《人生如棋》
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Android开源项目规范总结
  • HTML-表单
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • leetcode98. Validate Binary Search Tree
  • maven工程打包jar以及java jar命令的classpath使用
  • Terraform入门 - 3. 变更基础设施
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 汉诺塔算法
  • 将 Measurements 和 Units 应用到物理学
  • 微服务核心架构梳理
  • 终端用户监控:真实用户监控还是模拟监控?
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​Spring Boot 分片上传文件
  • ​业务双活的数据切换思路设计(下)
  • #if #elif #endif
  • $.ajax()
  • (06)Hive——正则表达式
  • (7)svelte 教程: Props(属性)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (四)汇编语言——简单程序
  • (四)事件系统
  • .net core控制台应用程序初识
  • .Net Web项目创建比较不错的参考文章
  • .NET开发不可不知、不可不用的辅助类(一)
  • @angular/cli项目构建--http(2)
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ SNOI 2013 ] Quare
  • [\u4e00-\u9fa5] //匹配中文字符
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [ai笔记9] openAI Sora技术文档引用文献汇总