Как создать фильтр без блокировки браузера?

#typescript #ecmascript-6

#typescript #ecmascript-6

Вопрос:

Сначала я начинаю эту тему с предупреждения о том, что, к сожалению, я не могу делать запросы для этого метода. Это работает следующим образом:

Когда пользователь обращается к странице, создается запрос и сохраняется в хранилище сеансов, из хранилища сеансов, который я должен искать с помощью фильтра.

После завершения поиска в хранилище сеансов по словам, которые относятся к введенным символам, я отображаю в HTML все найденные слова.

Я использую некоторые методы ES6, но когда я добавляю некоторые непреднамеренные символы, такие как, например:

1) Разное «…» 2) Различные пробелы

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

Как должен работать этот компонент? Пользователь введет некоторые символы во ввод, и над символом начнется поиск по этому «слову» ..

Поиск выполняется в хранилище сеанса, где содержится более 4k данных.

 abstract class FilterController {
    protected readonly _storageKey: string;
    protected readonly _typingValue: HTMLInputElement;
    protected readonly _bodyContainer: HTMLElement;
    protected readonly _listboxMain: HTMLElement;
    protected readonly _listboxSecondary: HTMLElement;

    constructor(storageKey: string, typingValue: HTMLInputElement, bodyContainer: HTMLElement, listboxMain: HTMLElement, listboxSecondary: HTMLElement){
        this._storageKey = storageKey;
        this._typingValue = typingValue;
        this._bodyContainer = bodyContainer;
        this._listboxMain = listboxMain;
        this._listboxSecondary = listboxSecondary;
    }

    protected get typedValue(): any {
        return this._typingValue.value;
    }

    protected get storageData(): any {
        return this.convertToJSON(sessionStorage.getItem(this._storageKey));
    }

    protected convertToJSON(_data: any): JSON {
        if (_data) {
            return JSON.parse(_data);
        }
    }

    protected blockFirstWhiteSpace(_event: KeyboardEvent): void {
        if (this.typedValue.length === 0 amp;amp; _event.code == 'Space') {
            _event.preventDefault();
        }
    }

    protected blockFirstPoint(_event: KeyboardEvent): void {
        if (this.typedValue.length === 1 amp;amp; _event.code == 'Period') {
            _event.preventDefault();
        }
    }

}

export default class FilterData extends FilterController {
    private _dataFound: any;

    constructor(storageKey: string, typingValue: HTMLInputElement, containerMain: HTMLElement, listboxMain: HTMLElement, listboxSecondary: HTMLElement) {
        super(storageKey, typingValue, containerMain, listboxMain, listboxSecondary);
    }

    private set dataFound(_data: any) {
        this._dataFound = _data;
    }

    private get dataFound(): any {
        return this._dataFound;
    }

    public initComponent() :void {
        this._typingValue.addEventListener('keypress', (_event: KeyboardEvent) => {
            this.blockFirstWhiteSpace(_event);
            this.blockFirstPoint(_event);
        });

        this._typingValue.addEventListener('keyup', (_event: KeyboardEvent) => {
            if (this.typedValue.length >= 2) {
                this.search();
            }
        });
    }

    private search(): void {
        if (this.storageData) {
            if (this.typedValue.length === 2) {
                this.filterDataIndex();
            } else if (this.typedValue.length > 2) {
                setTimeout(() => {
                    this.filterData();
                }, 50);
            }
        }
    }

    private filterData(): void {
        this.dataFound = this.storageData.filter((_value: any) => {
            let storageItemIndex = _value.search(this.typedValue.toUpperCase());
            if (storageItemIndex !== -1) {
                return this.storageData[storageItemIndex];
            }
        });
    }

    private filterDataIndex(): void {
        let storageItemIndex = this.storageData.indexOf(this.typedValue.toUpperCase());
        if (storageItemIndex !== -1) {
            this.dataFound = this.storageData[storageItemIndex];
        }
    }


}
  

Комментарии:

1. В Javascript нет общедоступных / частных / защищенных, не могли бы вы, пожалуйста, убедиться, что используете правильные теги?

2. Javascript этого не делает, однако я использую Typescript! Что ничто другое не является надмножеством javascript и которое при компиляции тоже превращается в JS .. Единственное визуальное отличие, которое вы увидите, — это ориентация объекта, остальное идентично.

3. да, но есть причина, по которой в SO есть теги, поэтому, если вы пометите вопрос typescript с помощью javascript, несколько тысяч человек подпишутся на этот тег, получая уведомления по электронной почте и т.д. пойдет «.. что?». Так что будьте добры к этим людям, пожалуйста. Помните: многие из них не знают typescript или даже не заботятся о нем, в то время как все, подписавшиеся на тег typescript, знают.