Может ли Validator иметь доступ к свойству из пользовательского элемента управления формы в Angular? - PullRequest
0 голосов
/ 07 марта 2020

Обычно валидаторы проверяют только предоставленное значение формы, но мне интересно, возможно ли иметь доступ к свойствам из CustomFormControl внутри моего валидатора. Я хочу, потому что значение в моем CustomFormControl это просто идентификатор. Хотя я хочу сохранить возможность добавления валидатора в построителе форм.

В настоящее время я решил эту проблему, добавив новое свойство к ngControl.control объекту, но, может быть, есть гораздо лучшее решение?

Это моя форма, в которую я добавил свой валидатор my CustomFormControl

this.invoiceForm = this.formBuilder.group({
    submittedBy: ["", isActiveValidator]
});

Это мой валидатор, обратите внимание, что я назвал c.selectedItem?.isActive - selectedItem - новое свойство.

export function isActiveValidator(c: MyControlTypeahead): any {
    return c.selectedItem?.isActive ? null : {
        isActiveError: {
            id: c.value
        }
    };
}

И эта часть моего элемента управления пользовательской формы. Когда элемент выбран, я добавляю новое свойство к своему поврежденному ngControl

export interface MyControlTypeahead extends AbstractControl {
    selectedItem: MyItem;
}

@Component({
    selector: "app-party-typeahead",
    templateUrl: "./app-party-typeahead.component.html"
})
export class PartyTypeaheadComponent implements ControlValueAccessor, OnInit {

constructor(
    @Self() private ngControl: NgControl) {
    ngControl.valueAccessor = this;
}

onChange(item: MyItem): void {
    (this.ngControl.control as MyControlTypeahead).selectedItem = item;
    this._onChange(item?.id);
}

....

Вместо добавления нового свойства к ngControl Я хотел бы назначить новый элемент локальной переменной this.selectedItem = item и каким-то образом в моем валидаторе есть доступ к этому свойству, но я понятия не имею, как мне этого добиться?

...