JEditableTableUtil.js 2.7 KB

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