JEditableTableUtil.js 2.9 KB

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