Принимая следующую логику:
@Injectable() export class HomeService {
...
fetchFromBackEnd():Observable<Foo>{
// somehow get the current endpoint
// and call a method from angular´s HttpClient
// with the endpoint
}
}
Учитывая этот сценарий, у вас есть 2 пути, которые ведут к возможному решению:
- Реактивный (асинхронный)
- Нереактивный (синхронный)
Первый будет выглядеть более или менее так:
import {Observable} from 'rxjs/Observable'
import {switchMap, take}from 'rxjs/operators';
@Injectable() export class HomeService {
url$: Observable<string>;
constructor(){
this.url$ = this.createUrlStream();
}
fetchFromBackEnd():Observable<Foo>{
const fetch: string => Observable<Foo> = (url) => this.http.get<Foo>(url);
return this.url$.pipe(take(1),switchMap(url => fetch(url));
}
private createUrlStream():Observable<string>{
// logic to map media query changes to a URL
}
}
Нереактивный подход будет выглядеть следующим образом:
@Injectable() export class HomeService {
get url(): string {
// logic to synchronously match the current media breakpoints
// to a URL
}
fetchFromBackEnd():Observable<Foo>{
return this.http<Foo>(this.url);
}
}
Чтобы не заново изобретать колесо или напрямую иметь дело с объектом window
или другими деталями реализации, я бы предложил вам ввести еще один уровень абстракции с помощью LayoutModule углового материала CDK lib.
При использовании BreakpointObserver , предоставляемого библиотекой, 2-я реализация будет выглядеть так:
@Injectable() export class HomeService {
get url(): string {
return this.isMobile ? "mobileurl" : "desktopurl";
}
private get isMobile():boolean {
// example
return this.bpObserver.isMatched('(max-width: 599px)')
}
constructor(private bpObserver: BreakPointObserver){
}
fetchFromBackEnd():Observable<Foo>{
return this.http<Foo>(this.url);
}
}