Может быть, он существует, и я не мог его найти, но я просто хотел добавить простой индикатор в стиле полосок уровня сигнала на мобильном телефоне в свое веб-приложение.

Мои требования были просты. Он должен работать в angular, он должен использовать значки Font Awesome (используя поддержку Angular), он должен отображаться в автономном режиме/онлайн. Мне пришлось покопаться, чтобы узнать, как это сделать, поэтому я хотел скомпилировать решение здесь, чтобы его могли увидеть все (а также для меня в следующий раз, когда я захочу это сделать..)

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

Итак, моим первым исследованием было выяснить, есть ли у Font Awesome для этого какая-то иконка, которая позволяла бы отображать нужное количество полос. Это не так, насколько я знаю. Прочитал ветку об этом, и сетую, что они что-то не создали.

Но было решение, как это сделать, поэтому я так и сделал. Метод использовал слои шрифтов, классные иконки и CSS. Накладывая и смещая значок поверх значка сигнала с настройкой непрозрачности, мы можем затемнить нужные нам полосы. Однако он не использовал Angular Font Awesome, поэтому мне пришлось изменить его соответствующим образом:

    <!-- icon with no bars -->
    <fa-icon *ngIf="connSpeed == 'offline'" [icon]="faSignal" style="opacity: .5"></fa-icon>
    <!-- icon with 1 bar -->
    <fa-layers *ngIf="connSpeed == 'slow-2g'" [fixedWidth]="true">
        <fa-icon [icon]="faSquare" transform="right-2" [mask]="faSignal"></fa-icon>
        <fa-icon [icon]="faSquare" style="opacity: .5" transform="left-14" [mask]="faSignal"></fa-icon>
    </fa-layers>
    <!-- icon with 2 bar -->
    <fa-layers *ngIf="connSpeed == '2g'" [fixedWidth]="true">
        <fa-icon [icon]="faSquare" transform="right-6" [mask]="faSignal"></fa-icon>
        <fa-icon [icon]="faSquare" style="opacity: .5" transform="left-10" [mask]="faSignal"></fa-icon>
    </fa-layers>
    <!-- icon with 3 bar -->
    <fa-layers *ngIf="connSpeed == '3g'" [fixedWidth]="true">
        <fa-icon [icon]="faSquare" transform="right-10" [mask]="faSignal"></fa-icon>
        <fa-icon [icon]="faSquare" style="opacity: .5" transform="left-6" [mask]="faSignal"></fa-icon>
    </fa-layers>
<!-- icon with 4 bar -->
    <!--fa-layers *ngIf="connSpeed == '4g'" [fixedWidth]="true">
        <fa-icon [icon]="faSquare" transform="right-14" [mask]="faSignal"></fa-icon>
        <fa-icon [icon]="faSquare" style="opacity: .5" transform="left-2" [mask]="faSignal"></fa-icon>
    </fa-layers -->    
    <!-- icon with 5 bar -->
    <fa-icon *ngIf="connSpeed == '4g'" [icon]="faSignal"></fa-icon>

И на стороне машинописного текста:

import { faSignal, faSquareFull } from '@fortawesome/free-solid-svg-icons';
...
export class MyComponent {
    faSignal = faSignal;
    faSquare = faSquareFull;
    public connSpeed = "";

Значок имеет 6 полос, но, как вы увидите, определение скорости дает только 4 скорости, поэтому я просто закомментировал одну из полос.

Теперь об обнаружении онлайн- и офлайн-статуса и скорости. Здесь используются две разные вещи. Для онлайн/оффлайн вы просто добавляете декоратор в Angular, чтобы получить событие под названием:

@HostListener('window:offline')
    setNetworkOffline(): void {
    this.connSpeed = 'offline';
}
@HostListener('window:online')
    setNetworkOnline(): void {
    this.connSpeed = navigator.connection.effectiveType;
}

Вы заметите, что для онлайн-события мы установили скорость на значение в navigator.connection, которое является одним из четырех значений: slow-2g, 2g, 3g или 4g.

Чтобы получать обновления скорости, пока мы в сети, мы можем создать наблюдаемый объект следующим образом (благодаря Netanel Basal за этот фрагмент кода):

type Connection = {
    effectiveType: string;
}
declare global {
    interface Navigator {
        connection: {
            effectiveType: string;
            addEventListener: Function;
            removeEventListener: Function;
        }
    }
}
...
    ngOnInit() {
//** create an observable that triggers on connection speed changes */
        const connection$ = new Observable((observer) => {
            const { effectiveType } = navigator.connection;
            observer.next(effectiveType);
const onConnectionChange = () => {
                const { effectiveType } = navigator.connection;
                observer.next(effectiveType);
            };
navigator.connection.addEventListener("change", onConnectionChange);
return () => {
                navigator.connection.removeEventListener(
                    "change",
                    onConnectionChange
                );
                observer.complete();
            };
        });
//** and then subscribe to it
connection$.subscribe((effectiveType: string) => {
            this.connSpeed = effectiveType;
        });
    }

Таким образом, всякий раз, когда скорость изменяется, значки будут соответственно обновляться. Престо. Теперь, когда наши пользователи жалуются, что сайт не работает, мы можем попросить их проверить свои бары, и если они низкие, мы можем сказать им, что их Wi-Fi, вероятно, недостаточно быстр, что обычно и является проблемой…