Как уведомить компонент дампа при сбое http-вызова?

В настоящее время у меня есть умный компонент products.component.ts и один компонент дампа products-create.component.ts, Компонент дампа отправляет событие интеллектуальному компоненту, когда пользователь отправляет кнопку "Создать".

products.component.ts делает http позвоните, чтобы сохранить продукт на сервере. Теперь мне нужно знать, как уведомить компонент дампа о том, что вызов службы выполнен успешно или не выполнен? Компонент dump должен показывать ошибку при сбое и переходить к списку компонентов при успехе.

2 ответа

Ну, вы могли бы использовать RXJS'S Subejct или же BehaviorSubject многоадресная передача данных.
Example

Лучше всего поделится одним http запрос нескольких наблюдателей с использованием shareReplay оператор и принять меры соответственно.
Вы должны осознавать тот факт, что http возвращает наблюдаемую простуду и когда простуду observable имеет несколько subscribers весь поток данных переизлучается для каждого subscriber, Каждый подписчик становится независимым и получает свой собственный поток данных.

Избежать дублирования HTTP-запросов shareReplay Оператор используется.

 import { Injectable } from '@angular/core';
    import { HttpClient } from '@angular/common/http';
    import {Observable} from 'rxjs';
    import {shareReplay,tap}from 'rxjs/operators';
    @Injectable()
    export class ShareService {

    public response$:Observable<any>;
    constructor(private httpc:HttpClient)
    {
      this.sendRequest();
    }
    public sendRequest()
    {

     this.response$= this.httpc.get('url').
        pipe(tap(res=>{console.log('called');return res;}),shareReplay(1))

    }
    fetchData()
    {

    return this.response$;
    }
    }

products.component.ts:

     constructor(service:ShareService)
      {

         service.fetchData().subscribe(result=>{
         console.log(result);

        })

продукты-create.component.ts:

     constructor(service:ShareService)
      {

         service.fetchData().subscribe(result=>{

         console.log(result);this.route.navigate(['listcomp'])

        }
        error=>{your logic}
         )

Further Reading

Вы можете сделать это внутри метода ngOnChanges из интерфейса OnChanges:

По сути, вам нужно передать свойство из родительского компонента в дочерний компонент с именем responseState. Если это свойство изменилось по сравнению с родительским компонентом, запускается метод ngOnChanges, то вы проверяете значение свойства.

child.component.ts:

@Component({...})
export class ChildComponent implements OnChanges {
  @Input() responseState: boolean;

  // this method is triggered when the Input properties changed.
  ngOnChanges() {
     if(responseState) {
            // successful request
     }else {
           // failed request
     }
  }
}

в родительском компоненте:

@Component({...})
export class ParentComponent {
   responseState = undefined;

   doRequest() {
       /**
        * If the request is failed,
        * set 'this.responseState = false'
        * 
        * if the request is successful
        * set 'this.responseState = true'
        */
   }
}

родительский шаблон:

...
<child-component
   [responseState]='responseState'
> </child-component>
...
Другие вопросы по тегам