baidu / amis

前端低代码框架,通过 JSON 配置就能生成各种页面。
https://baidu.github.io/amis/
Apache License 2.0
17.27k stars 2.51k forks source link

validateApi 验证 联动数据时, 即使设置了 ``"validateOnChange": true,`` , 也只会验证第一次时候的数据 #10360

Open yanquer opened 4 months ago

yanquer commented 4 months ago

描述问题:

validateApi 验证 联动数据 时, 即使设置了 "validateOnChange": true, , 也只会验证第一次时候的数据

截图或视频:

如何复现(请务必完整填写下面内容):

  1. 你是如何使用 amis 的?

amis + react

  1. amis 版本

3.5.2

  1. 粘贴有问题的完整 amis schema 代码:

    {
    type: "select",
    label: "选择想要的数据",
    name: "select-want",
    options: msgLevelOption,
    multiple: true,
    value: "${help\\-for\\-want\\-select}",      // 有斜杠转义
    
    // 单项数据校验
    validateApi: {
      "method": "post",
      "url": "/post/save/data",
      "data": {
          "select-want": "${select\\-want | sortByVal:" + msgLevel + "}",
          // "select-want": "${help\\-for\\-want\\-select}",
      },
    },
    // 这个有个bug, 当 value 是通过其他组件联动修改的时候, 修改后的数据不会触发校验.
    "validateOnChange": true,
    },
    {
    label: "辅助select",
    type: "input-text",
    name: "help-for-want-select",
    value: "${select\\-want | sortByVal:" + msgLevel + "}",
    // visible: false,
    },

如schema所示, 我想将 select-want 的数据经过转换后再验证, 目前能用的方法只有在 api 中显示将数据先转换一遍. 因为 select-want 的数据被 help-for-want-select 联动刷新后, 不会触发validateApi.

剩余关键部分代码上下文

const registerSortByVal = () => {
    // 按照给定 sortData 的顺序排序
    registerFilter('sortByVal', (data: string, sortData: string[]) => {
        if (!data || data.indexOf(',') === -1) return data
        const newData = data.split(',')
        newData.sort((a, b) => {
            const aIndex = sortData.indexOf(a)
            const bIndex = sortData.indexOf(b)
            return aIndex > bIndex ? 1 : -1;
        })
        return newData.join(',')
    })
}

const msgLevel = ['debug', 'info', 'warning', 'error', 'circ']
const msgLevelOption = msgLevel.map<optionProp>(data => {
    return {
        label: data,
        value: data
    }
})

registerSortByVal()

问题

我不确定这算不算是一个bug, 但正常来说, 即使是联动改变数据也应该触发提交.

  1. 其他说明

这里使用 过滤器 而不是 表达式 是因为, 表达式传不进去参数, 官网只找到自定义过滤器的说明而无自定表达式的说明; 请问官方是否有这样的支持(自定义表达式).

github-actions[bot] commented 4 months ago

👍 Thanks for this! 🏷 I have applied any labels matching special text in your issue.

Please review the labels and make any necessary changes.