Динамически добавлять методы внутри класса - PullRequest
0 голосов
/ 11 мая 2018

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

Вот служба:

@Injectable()
export class UtilitiesService {
    public keySet = [
        "CalendarDates", 
        "LastPublishedSchedule", 
        "ManageStores",
        "SelectedStore"
    ];

    constructor() {
        this.addGetSetClearFunctions();
    }

    addGetFunction(key: string) {
        UtilitiesService["get" + key] = function() {
            return JSON.parse(sessionStorage.getItem(key));
        }
    }

    addSetFunction(key: string) {
        UtilitiesService["set" + key] = function(value) {
            sessionStorage.setItem(key, JSON.stringify(value));
        }
    }

    addClearFunction(key: string) {
        UtilitiesService["clear" + key] = function() {
            sessionStorage.removeItem(key);
        }
    }

    clearAll() {
        sessionStorage.clear();
    }

    addGetSetClearFunctions() {
        for(let i = 0; i < this.keySet.length; i++) {
            this.addGetFunction(this.keySet[i]);
            this.addSetFunction(this.keySet[i]);
            this.addClearFunction(this.keySet[i]);
        }
    }
}

Я пытаюсь вызвать внутри метода set внутри компонента:

this.utilService.setLastPublishedSchedule(JSON.stringify(response));

Примечание: utilService введен правильно, и другие его вспомогательные функции (которые я здесь не поместил, успешно выполняются).

Редактировать # 1:Это ошибка, которую я получаю:

ОШИБКА в src / app / dashboard / components / schedule / schedule.component.ts (344,22): ошибка TS2339: свойство 'setLastPublishedSchedule' не существуетдля типа 'UtilitiesService'.

Редактировать # 2: я пытался вызвать метод с помощью:

this.utilService['setLastPublishedSchedule'](argument here)

Я получил эту ошибку времени выполнения:

ОШИБКА TypeError: _this.utilService.setLastPublishedSchedule не является функцией

1 Ответ

0 голосов
/ 11 мая 2018

Ошибка указывает, что метод не существует.Есть способы обойти это (например, приведение к any), но они нарушают безопасность типов.Лучшим решением является добавление метода, который принимает ключ в качестве параметра для вашей службы и вызывает его таким образом.

setValue(key: "CalendarDates"|"LastPublishedSchedule"|"ManageStores"|"SelectedStore", value: string) {
   sessionStorage.setItem(key, value);
}
this.utilService.setValue("LastPublishedSchedule", JSON.stringify(response));

Вы можете повторить этот шаблон для других методов, таких как получение значения или очистказначения.

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

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