【问题标题】:Pass context this as parameter in custom validator在自定义验证器中传递上下文 this 作为参数
【发布时间】:2018-08-31 21:37:31
【问题描述】:

我尝试在自定义异步验证器中传递一个类属性,但当我从该验证器记录它时,它的值仍然总是undefined...

来自 CustomValidators.js:

static isValidPlace(place: Place, controlName: string): AsyncValidatorFn {
    return (control: FormControl): Observable<{ [key: string]: boolean }> => {
      console.log('control', control.value);
      console.log('place', place);

      if (place && place.label !== control.value)
        return Observable.of({ 'invalidPlace': true });

      return Observable.empty();
    }
}

来自组件:

city: FormControl = this.fb.control(
  '', 
  Validators.required, 
  CustomValidators.isValidPlace(this.citySelection, 'city').bind(this)
);

我在触发以下 fn 的字段上附加(更改)事件:

onSelectionCity = (selection: Place): Place => this.citySelection = selection;

问题:如何通过我的自定义验证器传递更新后的citySelection 属性?


我想做什么:

当用户单击结果列表时,我需要一个 api 发送的 id,该结果列表本身取决于在 formControl(输入)中键入的值。

问题是,当用户更改值时,我必须考虑 formControl 无效,因为验证输入字段的唯一方法是单击列表以获取 id。同时,如果值发生变化,id 变得不正确,我想应用这种行为。

示例:想象一下 Google 搜索引擎与著名的“搜索”按钮稍有不同。 事实上,当您在搜索字段中写入内容时,就会显示一个列表。现在您单击其中一项。

现在想象一秒钟,按钮需要一个 id 来搜索正确的信息,并且这个 id 正在触发 clicks 事件。

您的 id 很好,但是更改文本,输入字段必须无效,因为您之前获得的 id 与您潜在的新搜索要求不同。

我的建议是将包含标签、id 和其他东西selectionCity 保存在我的组件类上的 clicks 事件与 formControl 的实际值进行比较,以通过简单的三重比较来确定有效性。

【问题讨论】:

  • 这带来了一个重要的问题:你为什么要这样做
  • @trichetriche 请看上面,我为你写了一些东西
  • 所以基本上,您想使用更新的 ID 进行验证?
  • 与其将组件绑定到验证器,不如直接使用更新的验证器重新创建表单控件?
  • Pas de souci, c'est fait !

标签: angular typescript


【解决方案1】:

与其尝试将组件绑定到验证器,不如在 ID 更改后重新创建表单控件或更新其验证器。

onValueChange = () => {
  this.myForm.controls['controlName']
    .clearValidators() 
    .setValidators([
      Validators.required,
      CustomValidators.isValidPlace(this.citySelection, 'city')
  ]);
}

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多