внедрить одну услугу в другую и иметь доступ к членам службы инъекций угловой 7 - PullRequest
0 голосов
/ 21 июня 2019

все, что я читаю здесь: https://angular.io/guide/dependency-injection-in-action кажется, что это возможно, но я получаю эту ошибку при попытке вызвать метод для моего внедренного сервиса из другого сервиса:

TypeError: Невозможно прочитать свойство 'isLoggedIn' из неопределенного в CatchSubscriber.handleError [как селектор] (project.service.ts: 30) в CatchSubscriber.error (catchError.js: 29) в TapSubscriber._error (tap.js:56) в TapSubscriber.error (Subscriber.js: 55) в MapSubscriber._error (Subscriber.js: 75) в MapSubscriber.error (Subscriber.js: 55) в FilterSubscriber._error (Subscriber.js: 75) в FilterSubscriber.jpg(Subscriber.js: 55) в MergeMapSubscriber.notifyError (OuterSubscriber.js: 7) в InnerSubscriber._error (InnerSubscriber.js: 14)

Вот мои ProjectService, которые вводят мои UserService

import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
import { Observable, throwError, of } from 'rxjs';
import { catchError, tap, map } from 'rxjs/operators';
import { AuthHeader } from '../../Shared/Helpers/AuthHeader';
import { UserService } from '../../User/Services/user.service';

@Injectable({
  providedIn: 'root'
})
export class ProjectService {

  constructor(private http: HttpClient, private userService: UserService) {

  }
  private projectsApiEndPointRoot = '/api/ProjectApi/';
  test(): Observable<number> {
    return <Observable<number>>this.http.get<number>(this.projectsApiEndPointRoot + "getimages/8", { headers: AuthHeader.getAuthHeader() }).pipe(
      tap(data => console.log(data)),
      catchError(this.handleError)
    );
  }

  private handleError(err: HttpErrorResponse) {
    let errorMessage = '';
    if (err.error instanceof ErrorEvent) {
      errorMessage = `An error occurred: ${err.error.message}`;
    } else {
      if (err.status == 401 || err.status == 403) {
        console.log(this.userService.isLoggedIn());
      }
      else {
        errorMessage = `Server returned code: ${err.status}, error message is: ${err.message}`;
      }
    }
    console.error(errorMessage);
    return throwError(errorMessage);
  }
}

У UserService просто есть метод, который должен возвращать логическое значение независимо от того, вошел ли пользователь в систему. Я успешно использую тот же метод на нескольких компонентах, но он не работает, когдаn пытается вызвать его из этой другой службы.

Разве это невозможно сделать?

РЕДАКТИРОВАТЬ: добавление битов UserService для демонстрации:

import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError, of, BehaviorSubject } from 'rxjs';
import { catchError, tap, map } from 'rxjs/operators';
import { EmailModel } from '../Models/EmailModel';
import { ILoginRequest } from '../Interfaces/ILoginRequest';
import { ILoginResponse } from '../Interfaces/ILoginResponse';
import { IRegistrationRequest } from '../Interfaces/IRegistrationRequest';
import { Router } from '@angular/router';


@Injectable({
  providedIn: 'root'
})
export class UserService {
  constructor(private http: HttpClient, private router: Router) { }
  private usersApiEndPointRoot = 'api/UserApi/';

  private loggedIn = false;
  ...

  isLoggedIn() {
    return this.loggedIn;
  }


  private handleError(err: HttpErrorResponse) {
    let errorMessage = '';
    if (err.error instanceof ErrorEvent) {
      errorMessage = `An error occurred: ${err.error.message}`;
    } else {
      errorMessage = `Server returned code: ${err.status}, error message is: ${err.message}`;
    }
    console.error(errorMessage);
    return throwError(errorMessage);
  }
}

Ответы [ 3 ]

4 голосов
/ 21 июня 2019

Проблема в том, что вы передаете функцию в службу пользователя. Когда он вызывается, значением this будет окно.

Вместо передачи функции в функцию catchError используйте лямбда-функцию, чтобы она сохранялась. Внесите следующие изменения в метод test(), и ваша проблема будет решена:

test(): Observable<number> {
  return <Observable<number>>this.http.get<number>(this.projectsApiEndPointRoot + 
      "getimages/8", { headers: AuthHeader.getAuthHeader() }).pipe(
    tap(data => console.log(data)),
    catchError(err => this.handleError(err)) // <--
  );
}
2 голосов
/ 21 июня 2019

Вам нужно использовать функции стрелок в catchError, чтобы иметь возможность использовать контекст класса this.

catchError((err) => this.handleError(err))

В противном случае контекст теряется.

0 голосов
/ 21 июня 2019

Я также добавлю свой комментарий в качестве ответа, поскольку он немного отличается от других ответов.

Измените сигнатуру вашего метода следующим образом:

private handleError = (err: HttpErrorResponse) => {...}

Тогда вы можете оставить catchError(this.handleError) как есть, если хотите.

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