You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

113 lines
3.1 KiB

  1. const FormTypes = {
  2. normal: 'normal',
  3. input: 'input',
  4. inputNumber: 'inputNumber',
  5. checkbox: 'checkbox',
  6. select: 'select',
  7. date: 'date',
  8. datetime: 'datetime',
  9. upload: 'upload',
  10. file: 'file',
  11. image: 'image',
  12. popup:'popup',
  13. list_multi:"list_multi",
  14. sel_search:"sel_search",
  15. radio:'radio',
  16. checkbox_meta:"checkbox_meta",
  17. input_pop:'input_pop',
  18. slot: 'slot',
  19. hidden: 'hidden'
  20. }
  21. const VALIDATE_NO_PASSED = Symbol()
  22. export { FormTypes, VALIDATE_NO_PASSED }
  23. /**
  24. * 获取指定的 $refs 对象
  25. * 有时候可能会遇到组件未挂载到页面中的情况,导致无法获取 $refs 中的某个对象
  26. * 这个方法可以等待挂载完成之后再返回 $refs 的对象,避免报错
  27. * @author sunjianlei
  28. **/
  29. export function getRefPromise(vm, name) {
  30. return new Promise((resolve) => {
  31. (function next() {
  32. let ref = vm.$refs[name]
  33. if (ref) {
  34. resolve(ref)
  35. } else {
  36. setTimeout(() => {
  37. next()
  38. }, 10)
  39. }
  40. })()
  41. })
  42. }
  43. /**
  44. * 一次性验证主表单和所有的次表单
  45. * @param form 主表单 form 对象
  46. * @param cases 接收一个数组,每项都是一个JEditableTable实例
  47. * @returns {Promise<any>}
  48. * @author sunjianlei
  49. */
  50. export function validateFormAndTables(form, cases) {
  51. if (!(form && typeof form.validateFields === 'function')) {
  52. throw `form 参数需要的是一个form对象,而传入的却是${typeof form}`
  53. }
  54. let options = {}
  55. return new Promise((resolve, reject) => {
  56. // 验证主表表单
  57. form.validateFields((err, values) => {
  58. err ? reject({ error: VALIDATE_NO_PASSED }) : resolve(values)
  59. })
  60. }).then(values => {
  61. Object.assign(options, { formValue: values })
  62. // 验证所有子表的表单
  63. return validateTables(cases)
  64. }).then(all => {
  65. Object.assign(options, { tablesValue: all })
  66. return Promise.resolve(options)
  67. }).catch(error => {
  68. return Promise.reject(error)
  69. })
  70. }
  71. /**
  72. * 验证并获取一个或多个表格的所有值
  73. * @param cases 接收一个数组,每项都是一个JEditableTable实例
  74. * @param deleteTempId 是否删除临时ID,如果设为true,行编辑就不返回新增行的ID,ID需要后台生成
  75. * @author sunjianlei
  76. */
  77. export function validateTables(cases, deleteTempId) {
  78. if (!(cases instanceof Array)) {
  79. throw `'validateTables'函数的'cases'参数需要的是一个数组,而传入的却是${typeof cases}`
  80. }
  81. return new Promise((resolve, reject) => {
  82. let tables = []
  83. let index = 0;
  84. if(!cases || cases.length==0){
  85. resolve()
  86. }
  87. (function next() {
  88. let vm = cases[index]
  89. vm.getAll(true, deleteTempId).then(all => {
  90. tables[index] = all
  91. // 判断校验是否全部完成,完成返回成功,否则继续进行下一步校验
  92. if (++index === cases.length) {
  93. resolve(tables)
  94. } else (
  95. next()
  96. )
  97. }, error => {
  98. // 出现未验证通过的表单,不再进行下一步校验,直接返回失败并跳转到该表格
  99. if (error === VALIDATE_NO_PASSED) {
  100. reject({ error: VALIDATE_NO_PASSED, index })
  101. }
  102. reject(error)
  103. })
  104. })()
  105. })
  106. }