返回Lambda函数的函数-Lambda函数从何处获取输入?

时间:2018-08-03 06:36:20

标签: angular typescript lambda

任何人都可以在以下lambda函数中进行解释吗?

如果表单的field1field2具有相同的值,则此函数应将'mismatchedFields'设置为true / false并将其作为对象返回:

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

它在Angular形式验证器中使用,如下所示:

export class NewUserComponent {
    private form: any;

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

我不知道'matchingFields'在哪里将变量'form'提供给第一个'return'返回的lambda函数

任何人都可以解释该lambda函数的功能吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

设置时

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

您调用函数matchingFields,该函数从中返回另一个函数( arrow / lambda function )。调用之后,您可以认为您有一个类似的函数,该函数是从matchingFields返回的。

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,该引用是matchingFields的返回值。现在,Angular在验证阶段将自动调用此函数,并且form参数将自动传递给该函数。 form是运行验证的那个。

答案 1 :(得分:2)

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)

答案 2 :(得分:1)

下面是一个如何调用它的示例:

// 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));