У меня есть formGroup в моем компоненте, и я хотел бы присвоить значения formGroup переменной "searchParams" (экземпляр объекта класса), чтобы я мог передать searchParams в MongoDB для запроса. Я не хочу назначать каждое значение поля formGroup для searchParams, потому что некоторые поля formGroup могут быть пустыми, и включение полей с пустыми значениями как части searchParams для MongoDB приведет к неверному результату из MongoDB. Вот решение, которое я придумала, но интересно, есть ли более элегантный и менее многословный способ достижения того же самого. Вот мой код компонента:
export class searchComponent implements OnInit {
searchForm = new FormGroup({
name: new FormControl(''),
cityState: new FormControl(''),
zip: new FormControl('', Validators.pattern('[0-9]{5}'))
});
errorMessage: boolean;
searchParams: basicSearchParamsClass; //basicSearchParamsClass has a bunch of optional fields which correspond to the formGroup fields.
submitted = false;
invalidControlArray = [];
url: string = 'api/search';
@ViewChildren("formControl") varInputBoxes;
constructor(private renderer: Renderer2,
private cityStateParserService: CityStateParserService,
private httpService: HttpService,
private errorMessageService: ErrorMessageService) {}
ngOnInit() {}
onSubmit(){
this.submitted = true;
this.searchParams = {};
if (this.searchForm.value.cityState.trim()!="" || (this.searchForm.value.zip.trim()!="" && this.searchForm.valid)){
//This is the section where my solution starts
for (let item in this.childCareSearchForm.value){
if(this.searchForm.value[item].trim() !== ""){
this.searchParams[item] = this.searchForm.value[item]
}
};
if (this.searchParams.cityState) {
this.searchParams.city = this.cityStateParserService.cityStateParser(this.searchParams.cityState).cityParsed;
this.searchParams.state = this.cityStateParserService.cityStateParser(this.searchParams.cityState).stateParsed;
delete this.searchParams.cityState
};
//This is where my solution ends
this.getInformation();
}
else {
if (this.searchForm.value.cityState.trim()=="" && this.searchForm.value.zip.trim()==""){
this.renderer.selectRootElement(this.varInputBoxes._results[1].nativeElement).focus();
}
else{
this.renderer.selectRootElement(this.varInputBoxes._results[2].nativeElement).focus();
}
}
}
async getInformation(){
try{
console.log('this.searchParams: ', this.searchParams);
let searchData = await this.httpService.callDatabase<basicSearchParamsClass>('get', this.url, this.searchParams).toPromise();
this.errorMessage = false;
}
catch(error){
this.errorMessage = true;
}
this.submitted = false;
this.renderer.selectRootElement(this.varInputBoxes._results[0].nativeElement).focus();
}
}