代码之家  ›  专栏  ›  技术社区  ›  Lorraine Ram-El

函数返回lambda函数-lambda函数从何处获取其输入?

  •  1
  • Lorraine Ram-El  · 技术社区  · 7 年前

    有人能解释一下下面的lambda函数吗?

    此函数应将“mismatchedFields”设置为true/false,并将其作为对象返回,如果 field1 field2 具有相同的值:

    function matchingFields(field1, field2) {
        return form => {
            if(form.controls[field1].value !== form.controls[field2].value)
                return { mismatchedFields: true }
        }   
    }
    

    它用于角形验证器,如下所示:

    export class NewUserComponent {
        private form: any;
    
        constructor(private fb: FormBuilder) {
            this.form = fb.group({
                password: '',
                passwordConfirm: ''
            }, { validator: matchingFields('password', 'passwordConfirm')})
        }
    }
    

    我不明白在哪里 'matchingFields' 提供变量 'form' 返回到第一个 'return'

    有人能解释一下这个lambda函数的功能吗?

    谢谢。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Suren Srapyan    7 年前

    当你设置这个

    validator: matchingFields('password', 'passwordConfirm')
    

    你调用函数 matchingFields 从中返回另一个函数( 箭头/lambda函数 ). 在这个调用之后,您可以认为您有一个这样的函数,它是从 匹配字段 .

    function someFunction(form) {
       var field1 = 'password';
       var field2 = 'passwordConfirm';
    
       if(form.controls[field1].value !== form.controls[field2].value)
                return { mismatchedFields: true }
    }
    

    formGroup 现在你会有

    validator: someFunction
    

    你刚刚设置了 validator 到函数 someFunction ,这是从 匹配字段 . 现在这个函数将由 Angular 在验证阶段和 form 参数将自动传递给函数。这个 形式 是运行验证的那个。

        2
  •  2
  •   jensgram    7 年前

    这个 FormBuilder 调用沿路回调(即内部)

    这个 matchingFields 定义只是这个的一个泛化版本:

    …
    constructor(private fb: FormBuilder) {
      this.form = fb.group({
        password: '',
        passwordConfirm: ''
      }, {
        validator: form => {
            if (form.controls['password'].value !== form.controls['passwordConfirm'].value) {
              return { mismatchedFields: true }
            }
        }
      })
    }
    

    所以我想在里面 FormBuilder.group(a, b) 发生以下情况:

    b.validator(this.internalFormReference)
    
        3
  •  1
  •   ibenjelloun    7 年前

    下面是如何调用它的运行示例:

    // The function from the question
    function matchingFields(field1, field2) {
     return form => {
      if (form.controls[field1].value !== form.controls[field2].value)
       return {
        mismatchedFields: true
       }
     }
    }
    
    // A simplified version of the FormGroup object
    const form = {
    	controls: {
    		a: {
    			value: 'test'
    		},
    		b: {
    			value: 'test2'
    		}
    	}
    };
    
    // as form.a.value !== form.b.value the validator should not be undefined
    console.log(matchingFields('a', 'b')(form));