baidu/amis

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

Open

#10360 opened on May 31, 2024

View on GitHub
 (1 comment) (0 reactions) (0 assignees)TypeScript (15,576 stars) (2,268 forks)batch import
bughelp wantedneed confirm

Description

描述问题:

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. 其他说明

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

Contributor guide