"observable $ | asyn c" не работает с наблюдаемыми HttpClient, но успешно с оператором for - PullRequest
0 голосов
/ 08 мая 2020

Я следовал руководству по динамическим c формам (https://angular.io/guide/dynamic-form), и все работало нормально, пока я не попытался получить данные из HttpClient.

Проблема : @Input() questions: QuestionBase<string>[] = []; в «Dynami c -form.component.ts» возвращает значение null.

Что я изменил? В question.service.ts я заменил оператор of rx js на this.<myHttpClientInstance>.get<any>(...), и тогда ничего больше не работало.

При прочих равных Я предположил, что проблема заключается в изменении с of на this.<myHttpClientInstance>.get<any>(...). Поэтому я распечатал на консоли два разных вывода: of и this.<myHttpClientInstance>.get<any>(...). Они загадочно выглядят иначе. Вот они:

enter image description here

Заявление об ограничении ответственности : ничего не изменилось в "app.component. html" (в частности, я Имею в виду эту строку кода: [questions]="questions$ | async")

Есть подсказка?

Изменить:

Сервисный код

   constructor(private http: HttpClient) {}

   getFormElementsFromHttpClient() {

return this.http.get<FormElementBase<any>[]>(environment.apiUrl + '/attribute-manager-be/view/fields')
.pipe(map( (response : any[]) => {

  let formElementsList : FormElementBase<any>[] = [];

  for (const formElement of response) {

    switch (formElement.type) {

      case "text":

        formElementsList.push(

          new FormElementText({
            fieldId: formElement.id,
            key: formElement.key,
            label: formElement.label,
            value: formElement.defaultValue,
            required: formElement.required,
            order: formElement.position
          }),

        )

        break;

      case "dropdown":

        formElementsList.push(

          new FormElementDropdown({
            fieldId: formElement.id,
            key: formElement.key,
            label: formElement.label,
            options: formElement.options,
            required: formElement.required,
            order: formElement.position
          })

        )

        break;

      case "checkbox":

        formElementsList.push(

          new FormElementCheckbox({
            fieldId: formElement.id,
            key: formElement.key,
            label: formElement.label,
            type: formElement.type,
            order: formElement.position,
            required: formElement.required
          })

        )

        break;

      case "multipleDropdown":

        formElementsList.push(

          new FormElementMultipleDropdown({
            fieldId: formElement.id,
            key: formElement.key,
            label: formElement.label,
            options: formElement.options,
            order: formElement.position,
            required: formElement.required
          }),

        )

        break;

      default:
        break;
    }

  }

    return formElementsList.sort((a, b) => a.order - b.order);    

  }
  ));

   }

   getFormElementsFromForOperator() {

let questions: FormElementBase<string>[] = [

  new FormElementMultipleDropdown({
    fieldId: 2,
    label: "dropdown",
    position: 4,
    required: true,
    key: "idtdropdown",
    options: [
        {
            id: 1,
            key: "ciambella",
            value: "ciambella"
        },
        {
            id: 2,
            key: "oreo",
            value: "oreo"
        }
    ]
  }),

  new FormElementText({
    fieldId: 1,
    type: "text",
    label: "text",
    position: 3,
    required: true,
    key: "idtext",
    options: null
  }),

  new FormElementCheckbox({
    fieldId: 1,
    type: "checkbox",
    label: "checkbox",
    position: 4,
    required: true,
    key: "idcheckbox",
    options: null
  }),

  new FormElementDropdown({
    fieldId: 4,
    type: "multipleDropdown",
    label: "multipledropdown",
    position: 1,
    required: true,
    key: "multipledropdown",
    options: [
        {
            id: 3,
            key: "abbracci",
            value: "abbracci"
        },
        {
            id: 4,
            key: "fagottini",
            value: "fagottini"
        }
    ]
  })

];

return of(questions.sort((a, b) => a.order - b.order));


   }

Код компонента (ts)

     @Component({
       selector: 'app-home',
       templateUrl: './home.component.html',
       styleUrls: ['./home.component.css'],
       providers:  [FormService]
     })
     export class HomeComponent {

     questions$: Observable<FormElementBase<any>[]>;

       constructor(formService: FormService) {

         this.questions$ = formService.getFormElementsFromForOperator();

         console.log("(for operator) works", this.formelements$);
         console.log("(HttpClient) doesn't work", formService.getFormElementsFromHttpClient());

       }
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...