Перебор объекта класса в angular 7 - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть 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();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...