Я пытаюсь реализовать класс EventEmitter, который будет использоваться для передачи событий между компонентами MVC. Я новичок в шаблоне MVC JavaScripts.

EventEmitter.js

export default class EventEmitter {
    constructor() {
        this._events = {};
    }

    static on(event, listener) {
        (this._events[event] || (this._events[event] = [])).push(listener);
        return this;
    }

    static emit(event, args) {
        (this._events[event] || []).slice().forEach(listener => listener(args));
    }
}

Однако всякий раз, когда я пытаюсь создать какие-либо события, это не работает, поскольку я получаю сообщение об ошибке:

TypeError: (промежуточное значение) .emit не является функцией

Вот как я хочу создать свое событие из моего ModelClass.js :

import EventEmitter from "../EventEmitter.js";
export default class ModelClass extends EventEmitter {
    constructor(options) {
        super();
        super.emit('test', options);
    }

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

0
AndroidDev101 14 Окт 2018 в 12:31

1 ответ

Лучший ответ

Ваши методы - это static, поэтому они находятся в EventEmitter, а не в его экземплярах . Удалите static из on и emit.


Пара замечаний, FWIW:

  • Обычно вы просто используете this.emit(), даже если emit определен родительским классом. Нет необходимости в super.emit(), если вы специально не хотите обойти emit, определенный на текущем уровне (вы не определяете его, поэтому ...).

  • Как правило, лучше не вызывать методы из конструктора (потому что подклассы могут переопределять эти методы, но еще не имели возможности завершить их инициализацию) и, конечно, не позволять конструктору выполнять такое действие, как генерация события. Просто FWIW.

  • Вы также можете удалить emit из EventEmitter (или оставить его статическим) и вместо этого использовать ModelClass для вызова некоторого внутреннего эмиттера (или EventEmitter.emit). В противном случае вы делаете emit общедоступным методом ModelClass, что означает, что любой его потребитель может генерировать из него события, что, вероятно, не идеально.

Опять же, просто FWIW.

3
T.J. Crowder 14 Окт 2018 в 09:39