Проблема связана со способом разрешения имени this
. В тот момент, когда вызывается ваш метод onContextMenu
, this
равен , а не разрешен для вашего класса AppContextMenuComponent
(как вы могли ожидать). Чтобы увидеть это в действии, попробуйте вставить console.log(this)
где-нибудь в этом методе. Поскольку this
не разрешен, как вы могли ожидать, оператор присваивания this._isOpen = true
не выполняет то, что вам нужно. Одним из быстрых решений этой проблемы является явное «связывание» значения, к которому должно разрешиться имя this
, путем изменения настройки прослушивателя событий на:
.addEventListener('contextmenu', this.onContextMenu.bind(this));
// ^^^^^^^^^^^
Однако это может привести к проблемам, когда вы sh позже удалите прослушиватель этого события. Другие могут иметь лучшие решения для этого, но один из вариантов - использовать функцию стрелки вместо вашего метода (обратите внимание, что это основано на «предложении полей класса» , которое не является частью ES6).
Вот как выглядит это изменение:
private onContextMenu = ($event: MouseEvent): void => {
// ^ ^^
// Body remains unchanged
};
Вот обновленный проект StackBlitz с изменением.