что означает атрибут multi: true HTTP_INTERCEPTORS? - PullRequest
0 голосов
/ 02 июля 2018

Я новичок в Angular, и я только что построил перехватчик. Согласно нескольким учебникам, вы должны включить HTTP_INTERCEPTORS в app.module следующим образом:

providers: [{ provide: HTTP_INTERCEPTORS, useClass: MyInterceptor, multi: true }]

Мне было интересно, что означает / делает этот атрибут multi: true и можно ли его опустить или нет.

Я прочитал руководство angular.io об этом атрибуте. Они объясняют это следующим образом:

Я не понимаю эту часть:

Обратите внимание на параметр multi: true. Эта обязательная настройка сообщает Angular, что HTTP_INTERCEPTORS - это токен для мультипровайдера, который внедряет массив значений, а не одно значение.

Это проливает некоторый свет на концепцию, но я пока не совсем понимаю, когда перехватчик вводит несколько значений, а когда нет. Например, мой собственный перехватчик только меняет заголовки. Означает ли это, что оно вводит только одно значение?

Спасибо

EDIT:

Это мой перехватчик

import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { LoginService } from '../Services/login.service';


@Injectable()
export class JwtInterceptor implements HttpInterceptor {

    constructor(private loginService:LoginService){}

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // add authorization header with jwt token if available
        console.log("ik zit nu in de interceptor");
        let currentUser = this.loginService.getToken();
        if (currentUser !=="") {

            request = request.clone({
                headers: new HttpHeaders({
                    'Content-Type': 'application/json', 
                    'Authorization': `Bearer ${currentUser}`
                })
            });
        }
        return next.handle(request);
    }
}

Это список приложений app.module

  providers: [
    { provide: APP_BASE_HREF, useValue: '/' },
    { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },
    { provide: 'AUTH_URL', useValue: 'http://localhost:8080/auth' },
    { provide: 'API_URL', useValue: 'http://localhost:8080/api' },
    { provide: 'HEADERS', useValue: new HttpHeaders({'Content-Type': 'application/json'}) },
    LoginGuard,
    LoginService,
    UserService,
    MessageService
  ],

1 Ответ

0 голосов
/ 02 июля 2018

Из описания интерфейса ValueProvider мы можем прочитать для свойства multi:

Если true, то инжектор возвращает массив экземпляров. Это полезно чтобы позволить нескольким провайдерам распространяться по многим файлам, чтобы обеспечить информация о конфигурации для общего токена.

Это означает, что для токена, который мы предоставляем значение, будет использоваться более одного значения (или класса).

Например, см. этот пример (это пример проекта), где для токена HTTP_INTERCEPTORS указано использование класса (useClass) ErrorInterceptor и SecurityInterceptor. Чтобы это работало, нам нужно указать multi: true, чтобы Angular знала, что будет использоваться несколько значений (или классов).

{
  provide: HTTP_INTERCEPTORS,
  useClass: ErrorInterceptor,
  multi: true
},
{
  provide: HTTP_INTERCEPTORS,
  useClass: SecurityInterceptor,
  multi: true
},

Ключевым моментом здесь является то, что HTTP_INTERCEPTORS является токеном для нескольких поставщиков . Это означает, что при предоставлении нового значения или класса для этого токена требуется свойство multi, которое должно быть установлено на true.

См. В документации HttpClient , когда описано, как предоставить перехватчик часть, в которой указано:

Обратите внимание на опцию multi: true. Это обязательное значение говорит Angular, что HTTP_INTERCEPTORS - это токен для multiprovider , который внедряет массив значений, а не одно значение.

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