Как вернуть объект из службы в компонент в angular

Я хочу получить доступ к определенному json в ngOninit. Итак, у меня есть идентификатор при нажатии кнопки редактирования, и с помощью этого идентификатора я получаю полный объект из базы данных, такой как имя формы, форма json, которая и т. д. Итак, из службы я хочу вернуть этот json в ngOninit.

Вот сервис.

    GetFormById (id: number) {
    return this.httpClient.get<FormTemplate[]>(this.API_URL + 
    "GetFormTemplate/" + id).subscribe(data => {
      console.info(data);
      return data;
    });
    }

В консоли я получаю полный объект из базы данных, которую я сохранил.

Вот компонент

    ngOnInit() {
    const id = this.route.snapshot.paramMap.get('id');
    var json = this.dataService.GetFormById(+id);
    }

например, как я могу получить json в ngOnInit.

Редактировать

ngOnInit() {
const id = this.route.snapshot.paramMap.get('id');
this.dataService.GetFormById(+id).subscribe(response => {
  console.info(response);
  const temp = response['TemplateJson'];
     })

initJq();
  var formData = '[{"type":"header","subtype":"h1","label":"Inquiry"},{"type":"paragraph","subtype":"p","label":"Paragraph content"},{"type":"text","label":"First name","name":"text - 1554220470561","value":"Vipul","subtype":"text"},{"type":"date","label":"Date Field","className":"form - control","name":"date - 1554220484446","value":"2019 - 04 - 25"},{"type":"button","label":"Send Inquiry","subtype":"button","className":"btn btn - primary","name":"button - 1554220480284","style":"primary"}]';

  this.formBuilder = (<any>jQuery('.build-wrap')).formBuilder({ formData });

 // Sample code to handle promise to get for data on page load directly
  this.formBuilder.promise.then(formBuilder => {
    console.info(formBuilder.formData);
  });
}

как и любой json, который я получил во временном файле, я хочу передать его в var formData.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
9 609
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы не подписываетесь на Observable в классе обслуживания, а вместо этого в компоненте:

В сервисе просто верните Observable из вашего сервисного метода:

GetFormById (id: number): Observable<FormTemplate[]>{
    return this.httpClient.get<FormTemplate[]>(this.API_URL + "GetFormTemplate/" + id);
}

В компоненте вы подписываетесь на Observable, возвращаемый сервисным методом:

ngOnInit() {
  const id = this.route.snapshot.paramMap.get('id');
  this.dataService.GetFormById(+id).subscribe(data => {
    console.info(data);
  });
}

Я получаю этот объект в консоли {Id: 24, TemplateName: "school management", TemplateJson: "[↵{↵"type": "header",↵"subtype": "h1",↵"lab…"button- 1554701441337",↵"style":"primary"↵}↵]", CreatedOn: "2019-04-11T00:00:00", UpdatedOn: "2019-04-24T00:00:00"} так как я могу получить доступ TempleteJson из этого объекта на ngOnit

Ronak Dumaniya 10.04.2019 08:28

Не подписывайтесь внутри сервиса, подписывайтесь внутри компонента onInit.

GetFormById (id: number) {
    return this.httpClient.get<FormTemplate[]>(this.API_URL + "GetFormTemplate/" + id);
}

ngOnInit() {
    const id = this.route.snapshot.paramMap.get('id');
    this.dataService.GetFormById(+id).subscribe(data => {
      console.info(data);
    })
}

Я получаю этот объект в консоли {Id: 24, TemplateName: "school management", TemplateJson: "[↵{↵"type": "header",↵"subtype": "h1",↵"lab…"button- 1554701441337",↵"style":"primary"↵}↵]", CreatedOn: "2019-04-11T00:00:00", UpdatedOn: "2019-04-24T00:00:00"} так как я могу получить доступ TempleteJson из этого объекта на ngOnit

Ronak Dumaniya 10.04.2019 08:39
Ответ принят как подходящий

Это не то, как вы должны подписываться на наблюдаемые. Вам следует прочитать документация/руководство, когда дело доходит до обработки асинхронных операций (таких как HTTP-запросы). Между тем, вот как мы можем решить вашу проблему.

На вашей службе,

GetFormById (id: number) {
  return this.httpClient.get<FormTemplate[]>(`${this.API_URL}GetFormTemplate/${id}`);
}

В вашем component.ts мы возвращаем наблюдаемое значение, вызывая метод subscribe().

ngOnInit() {
  const id = this.route.snapshot.paramMap.get('id');
  this.dataService.GetFormById(id).subscribe(response => {
    console.info(response);
    const templateObj = response.TempleteJson;
  })
}

Я получаю этот объект в консоли {Id: 24, TemplateName: "school management", TemplateJson: "[↵{↵"type": "header",↵"subtype": "h1",↵"lab…"button- 1554701441337",↵"style":"primary"↵}↵]", CreatedOn: "2019-04-11T00:00:00", UpdatedOn: "2019-04-24T00:00:00"} так как я могу получить доступ TempleteJson из этого объекта на ngOnit

Ronak Dumaniya 10.04.2019 08:39

@RonakDumaniya хорошо, ты что-то возвращаешь. Хорошо, что именно вы хотите сделать с данными JSON? Имейте в виду, что вы можете рассматривать его как объект JavaScript. (например, ответ.Id)

wentjun 10.04.2019 08:45

могу ли я сохранить его в переменной, например var json = response.TempleteJson

Ronak Dumaniya 10.04.2019 08:56

Да, вы можете сохранить объект как переменную. Сделайте что-то вроде const templateObj = response.TempleteJson; Чтобы проверить, работает ли это, вы можете запустить console.info(templateObj)

wentjun 10.04.2019 08:58

Я получаю сообщение об ошибке, например, что TempleteJson не существует в FormTemplete[]

Ronak Dumaniya 10.04.2019 09:05

Попробуйте использовать response['TempleteJson']?

wentjun 10.04.2019 09:07

Вы уверены, что TemplateJson это правильное имя? Вложен ли он в другой объект?

wentjun 10.04.2019 09:15

const temp = ответ['TemplateJson']; как я могу получить доступ к этому временному файлу вне подписки, например, я хочу сохранить этот временный файл в другом var, который находится вне подписки

Ronak Dumaniya 10.04.2019 09:21

Вы не можете. Вы должны обрабатывать это в блоке subscribe. Вы можете либо вернуть его позже, либо связать его с другими методами RxJS.

wentjun 10.04.2019 09:27

Пожалуйста, помогите мне, как я могу вернуться? если у вас есть ссылка, пожалуйста, дайте мне

Ronak Dumaniya 10.04.2019 09:31

Подождите, просто чтобы проверить, вам нужен TemplateJson немедленно? Или он используется где-то позже? Можете ли вы рассказать мне больше, когда он используется?

wentjun 10.04.2019 09:39

У меня есть код редактирования, поэтому вы можете дать мне решение на его основе.

Ronak Dumaniya 10.04.2019 11:32

Давайте продолжить обсуждение в чате.

wentjun 10.04.2019 11:35

пожалуйста, проверьте эту проблему, из-за этого я застрял, и это последняя проблема

Ronak Dumaniya 10.04.2019 12:20

Другие вопросы по теме