Как я могу использовать AlertService (подставку для сообщений об ошибках) внутри другого сервиса? - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь подписать наблюдаемое внутри службы. Однако мне нужно использовать AlertService для отображения ошибок. Сервис внутри другого сервиса (круговая зависимость?).

Вот AlertService

@Injectable()
export class AlertService {
  private subject = new Subject<any>();
  private keepAfterNavigationChange = false;

  constructor(private router: Router) {
    // clear alert message on route change
    router.events.subscribe(event => {
      if (event instanceof NavigationStart) {
        if (this.keepAfterNavigationChange) {
          // only keep for a single location change
          this.keepAfterNavigationChange = false;
        } else {
          // clear alert
          this.subject.next();
        }
      }
    });
  }

  success(message: string, keepAfterNavigationChange = false) {
    this.keepAfterNavigationChange = keepAfterNavigationChange;
    this.subject.next({ type: 'success', text: message });
  }

  error(message: string, keepAfterNavigationChange = false) {
    this.keepAfterNavigationChange = keepAfterNavigationChange;
    this.subject.next({ type: 'error', text: message });
  }

  getMessage(): Observable<any> {
    return this.subject.asObservable();
  }
}

AlertService стал Mat Snackbar на AlertComponent. Я рендеринг этой закусочной на другие компоненты.

export class AlertComponent implements OnInit {
  message: any;

  constructor(private alertService: AlertService, public snackBar: MatSnackBar) { }

  ngOnInit() {
    // trigger Snackbar after AlertService is called
    this.alertService.getMessage().subscribe(message => {
      if (message != null) {
        // there is a message to show, so change snackbar style to match the message type
        if (message.type === 'error') {
          this.snackBar.open(message.text, undefined, { duration: 8000, verticalPosition: 'bottom', panelClass: ['snackbar-error'] });
        } else if (message.type === 'success') {
          this.snackBar.open(message.text, undefined, { duration: 8000, verticalPosition: 'bottom', panelClass: ['snackbar-success'] });
        } else {
          this.snackBar.open(message.text, undefined, { duration: 8000, verticalPosition: 'bottom' });
        }
      }
    });
  }

}

Я могу подписаться внутри компонентов, как это:

export class AboutComponent implements OnInit {
  
  ngOnInit() {
    this.emailService.sendEmail('example@gmail.com')
      .subscribe(code => {
          console.log(code);
          this.alertService.success('Thanks for your message!');
      }, error => {
        this.alertService.error('Error sending message.');
      }
    );
  }
      
}

@Injectable()
export class EmailService {

    constructor(private http: HttpClient) { }

    sendEmail(email: Email) {
        return this.http.post(BACKEND_URL + 'send', email);
    }
}

Однако я пытаюсь подписаться внутри службы, потому что EmailService будет использоваться более чем в одном компоненте. Как мне добиться этого поведения?

1 Ответ

0 голосов
/ 27 августа 2018

Ваш сервис может быть введен в другие сервисы

@Injectable()export class EmailService {

constructor(private http: HttpClient, private alertService: AlertService) { }

sendEmail(email: Email) {
    return this.http.post(BACKEND_URL + 'send', email).map( result => this.alertService.alert(result););


  }
}

Было бы круглым, если AlertService использует EmailService, а EmailService использует AlertService

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