@@ -25,6 +25,7 @@ export interface FormItemProps {
2525 filterRule ?: any ;
2626 isTextFormItem ?: boolean ;
2727 filterErrMsg ?: any ;
28+ validation ?: ( value : any ) => { isValid : boolean , errmsg ?: string } ;
2829 control ?: any ;
2930}
3031
@@ -41,7 +42,7 @@ export class RCREFormItem extends React.PureComponent<RCREFormItemProps, {}> {
4142
4243 static getComponentParseOptions ( ) {
4344 return {
44- blackList : [ 'filterRule' , 'filterErrMsg' ]
45+ blackList : [ 'filterRule' , 'filterErrMsg' , 'validation' ]
4546 } ;
4647 }
4748
@@ -124,15 +125,21 @@ export class RCREFormItem extends React.PureComponent<RCREFormItemProps, {}> {
124125
125126 let isRequiredChanged = prevProps . required !== this . props . required ;
126127 let isRuleChanged = ! isEqual ( prevRules , nextRules ) ;
127- let isFilterRuleChanged ;
128128
129- if ( prevProps . filterRule && this . props . filterRule ) {
130- let oldFilterRule = this . validFilterRule ( prevProps . filterRule , null , prevRunTime , prevProps . filterErrMsg ) ;
131- let nextFilterRule = this . validFilterRule ( this . props . filterRule , null , nextRunTime , this . props . filterErrMsg ) ;
132- isFilterRuleChanged = ! isEqual ( oldFilterRule , nextFilterRule ) ;
133- }
129+ // let isFilterRuleChanged;
130+ // if (prevProps.filterRule && this.props.filterRule) {
131+ // let oldFilterRule = this.validFilterRule(prevProps.filterRule, null, prevRunTime, prevProps.filterErrMsg);
132+ // let nextFilterRule = this.validFilterRule(this.props.filterRule, null, nextRunTime, this.props.filterErrMsg);
133+ // isFilterRuleChanged = !isEqual(oldFilterRule, nextFilterRule);
134+ // }
135+
136+ // if (prevProps.validation && this.props.validation) {
137+ // let oldStatus = this.runValidation(prevProps.validation, null, prevRunTime);
138+ // let nextStatus = this.runValidation(this.props.validation, null, nextRunTime);
139+ // isFilterRuleChanged = !isEqual(oldStatus, nextStatus);
140+ // }
134141
135- if ( isRequiredChanged || isRuleChanged || isFilterRuleChanged ) {
142+ if ( isRequiredChanged || isRuleChanged ) {
136143 let names = Object . keys ( this . controlElements ) ;
137144 for ( let name of names ) {
138145 let element = this . controlElements [ name ] ;
@@ -323,6 +330,33 @@ export class RCREFormItem extends React.PureComponent<RCREFormItemProps, {}> {
323330 } ;
324331 }
325332
333+ private runValidation = ( validation : any , data : any , runTime : RunTimeType ) : { isValid : boolean , errmsg : string } => {
334+ let stats = parseExpressionString ( validation , {
335+ ...runTime ,
336+ $args : {
337+ value : data
338+ }
339+ } ) ;
340+
341+ if ( ! stats ) {
342+ console . error ( 'RCREFormItem: your validation function did return an object with inValid property' ) ;
343+ return {
344+ isValid : false ,
345+ errmsg : 'validation exec failed'
346+ } ;
347+ }
348+
349+ if ( typeof stats === 'object' && ! stats . hasOwnProperty ( 'isValid' ) ) {
350+ console . error ( 'RCREFormItem: validation should return an object with inValid property' ) ;
351+ return {
352+ isValid : false ,
353+ errmsg : ''
354+ } ;
355+ }
356+
357+ return stats ;
358+ }
359+
326360 public validateFormItem = async (
327361 formItemName : string ,
328362 data : any ,
@@ -390,6 +424,12 @@ export class RCREFormItem extends React.PureComponent<RCREFormItemProps, {}> {
390424 errmsg = ret . errmsg ;
391425 }
392426
427+ if ( isValid && isExpression ( this . props . validation ) ) {
428+ let ret = this . runValidation ( this . props . validation , data , runTime ) ;
429+ isValid = ret . isValid ;
430+ errmsg = ret . errmsg ;
431+ }
432+
393433 if ( isValid && apiRule ) {
394434 let condition = apiRule . condition || true ;
395435
0 commit comments