Formula 公式

可以设置公式,将公式结果设置到指定表单项上。

该表单项是隐藏的

基本用法

```schema: scope=”body” { “type”: “form”, “body”: [ { “type”: “input-number”, “name”: “a”, “label”: “A” }, { “type”: “input-number”, “name”: “b”, “label”: “B” }, { “type”: “input-number”, “name”: “sum”, “label”: “和”, “disabled”: true, “description”: “自动计算 A + B” }, { “type”: “formula”, “name”: “sum”, “value”: 0, “formula”: “a + b” } ] }

  1. ## 自动应用
  2. ```schema: scope="body"
  3. {
  4. "type": "form",
  5. "body": [
  6. {
  7. "type": "input-number",
  8. "name": "a",
  9. "label": "A"
  10. },
  11. {
  12. "type": "input-number",
  13. "name": "b",
  14. "label": "B"
  15. },
  16. {
  17. "type": "input-number",
  18. "name": "sum",
  19. "label": "和",
  20. "disabled": true,
  21. "description": "自动计算 A + B"
  22. },
  23. {
  24. "type": "formula",
  25. "name": "sum",
  26. "value": 0,
  27. "formula": "a + b"
  28. }
  29. ]
  30. }

手动应用

配置"autoSet": false,然后按钮上配置target,配置值为formulaid值,就可以实现手动触发公式应用

```schema: scope=”body” { “type”: “form”, “body”: [ { “type”: “input-number”, “name”: “a”, “label”: “A” }, { “type”: “input-number”, “name”: “b”, “label”: “B” }, { “type”: “group”, “body”: [ { “type”: “input-number”, “name”: “sum”, “label”: “和”, “disabled”: true, “columnClassName”: “col-sm-11” }, { “type”: “button”, “label”: “计算”, “columnClassName”: “col-sm-1 v-bottom”, “target”: “theFormula” } ] }, { “type”: “formula”, “name”: “sum”, “id”: “theFormula”, “value”: 0, “formula”: “a + b”, “initSet”: false, “autoSet”: false } ] }

  1. > 为什么设置`id`而不是设置`name`?
  2. >
  3. > 因为`name`值已经用来设置目标变量名了,这个表单项肯定已经存在了,所以不是唯一了,不能够被按钮指定。
  4. ## 条件应用
  5. 可以配置`condition`用来指定作用条件,有两种写法:
  6. - tpl 语法,把关联的字段写上如: `${xxx} ${yyy}` 意思是当 xxx yyy 的取值结果变化了就再应用一次公式结果。
  7. - 自己写判断如: `this.xxx == "a" && this.xxx !== this.__prev.xxx` xxx 变化了,且新的值是字符 "a" 时应用,可以写更加复杂的判断。
  8. ```schema: scope="body"
  9. {
  10. "type": "form",
  11. "body": [
  12. {
  13. "type": "radios",
  14. "name": "radios",
  15. "label": "radios",
  16. "options": [
  17. {
  18. "label": "a",
  19. "value": "a"
  20. },
  21. {
  22. "label": "b",
  23. "value": "b"
  24. }
  25. ],
  26. "description": "radios 变化会自动清空 B"
  27. },
  28. {
  29. "type": "input-text",
  30. "name": "b",
  31. "label": "B"
  32. },
  33. {
  34. "type": "formula",
  35. "name": "b",
  36. "value": "some string",
  37. "formula": "''",
  38. "condition": "${radios}",
  39. "initSet": false
  40. }
  41. ]
  42. }

使用新表达式语法

1.5.0 及以上版本

通过新的表达式语法,可以调用其中的函数,比如

```schema: scope=”body” { “type”: “form”, “debug”: true, “body”: [ { “type”: “static”, “value”: “这个表单没有内容,通过上面的 debug 可以看到输出当前日期” }, { “type”: “formula”, “name”: “date”, “formula”: “${DATETOSTR(NOW(), ‘YYYY-MM-DD’)}” } ] }

  1. 这种写法默认会解决浮点数计算问题(需要更新到 amis 1.6.4 及以上版本),比如
  2. ```schema: scope="body"
  3. {
  4. "type": "form",
  5. "body": [
  6. {
  7. "type": "input-number",
  8. "name": "a",
  9. "value": 0.1,
  10. "label": "A"
  11. },
  12. {
  13. "type": "input-number",
  14. "name": "b",
  15. "value": 0.2,
  16. "label": "B"
  17. },
  18. {
  19. "type": "input-number",
  20. "name": "sum",
  21. "label": "直接相加",
  22. "disabled": true
  23. },
  24. {
  25. "type": "formula",
  26. "name": "sum",
  27. "formula": "a + b"
  28. },
  29. {
  30. "type": "input-number",
  31. "name": "sum-new",
  32. "label": "使用新表达式",
  33. "disabled": true
  34. },
  35. {
  36. "type": "formula",
  37. "name": "sum-new",
  38. "formula": "${a + b}"
  39. }
  40. ]
  41. }

属性表

属性名 类型 默认值 说明
name string 需要应用的表单项name值,公式结果将作用到此处指定的变量中去。
formula 表达式 应用的公式
condition 表达式 公式作用条件
initSet boolean true 初始化时是否设置
autoSet boolean true 观察公式结果,如果计算结果有变化,则自动应用到变量上
id boolean true 定义个名字,当某个按钮的目标指定为此值后,会触发一次公式应用。这个机制可以在 autoSet 为 false 时用来手动触发