Компонент уведомляется службой - PullRequest
0 голосов
/ 05 марта 2019

У меня есть сервис, который связывается со сторонним сервисом.Сервис выполняется несколькими компонентами в приложении.Я хотел бы получать уведомления в универсальном компоненте уведомлений всякий раз, когда происходит сбой службы (функция «DoSomethingWhenFails»).В настоящее время ссылка на общий компонент уведомления указана в app.component, и служба внедряется в этот компонент.

Я думал о чем-то вроде eventEmitter, который будет генерироваться в службе, но я не знаком с этимтип шаблона, когда сервис вводится.Каков наилучший способ сделать это?Смотрите мой код:

app.component.html:

<notify #messageBox ></notify>

Компонент:

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
 styleUrls: ['./app.component.scss']
})
export class AppComponent  {

@ViewChild('messageBox') messageBox : notify;

constructor(private someService: SomeService ) 

общий компонент уведомления:

export class notification 
{
  ShowNotificationWhenTheServiceFails()
  {
    DoSomethig();
  }
}

Услуга:

@Injectable({
  providedIn: 'root'
})


export class Service{

doSomething(): Observable<any> {
return this.http.get<AA>(URL, options).pipe(
     connectToThirdPArtyService();
  }),
   DoSomethingWhenFails();
  );
}

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Вы должны использовать rxjs Subject, чтобы выдавать значения всякий раз, когда в сервисном вызове происходит ошибка.Вы должны вызывать метод next().

@Injectable({
  providedIn: 'root'
})
export class Service{
  public notify$ = new Subject<any>();
  doSomething(): Observable<any> {
  return this.http.get<AA>(URL, options).pipe(
     connectToThirdPArtyService();
  }),
   this.notify$.next(true);
  );
}

В вашем компоненте вы должны прослушивать субъект $ notify следующим образом, используя метод subscribe, всякий раз, когда значение передается с использованием метода next, метод подписки в вашем компоненте вызывается, вы можете сделать что-то внутри notify$ подписки

export class notification implements OnInit {

  constructor(public service:Service) { }

  ngOnInit() {
    this.service.notify$.subscribe(messages => {  DoSomethig(); });
  }

}
0 голосов
/ 05 марта 2019

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

service.ts

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable()
export class DataService {

private messageSource = new BehaviorSubject('0');
currentMessage = this.messageSource.asObservable();

constructor() { }

changeNotification(number) {
this.messageSource.next(number)
}

}

parent.component.ts (компонент уведомления в вашем случае)

import { Component, OnInit } from '@angular/core';
import { DataService } from "../data.service";

@Component({
  selector: 'app-parent',
  template: `
    {{message}}
  `,
  styleUrls: ['./sibling.component.css']
})
export class ParentComponent implements OnInit {

  message:string;

  constructor(private data: DataService) { }

  ngOnInit() {
    this.data.changeNotification.subscribe(number => this.number = number)
  }

}

Когда происходит сбой, вы можете нажать на тему поведения, например,

constructor(private data: DataService) { }

 onFailure() {
    this.data.changeNotification("1")
  }

У вас может быть номер на уровне обслуживания, и его можно увеличивать в случае сбоя, нажимать на него или как угодно.

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