2
내 사이트의 메뉴 구성 요소가 있습니다. true
에서 false
으로 상태를 전환하는 방법과 클릭 또는 키 누르기를 수신하는 또 다른 방법을 사용하는 경우 - 사용자가 페이지 의 아무 곳이나 클릭하면 메뉴가이 아닌 것을 숨길 수 있습니다.컨트롤러의 각도 전환 상태
내 코드는 다음과 같습니다
import app from '../../bootstrap.js';
import template from './siteMenu.html';
class siteMenuController {
constructor($element) {
this.activeMenuClass = `${this.className}--active`;
this.el = $element;
this.state = false;
this.listeners();
}
activateMenu(close = false) {
if (close) {
this.state = false;
} else {
this.state = !this.state;
}
}
catchEvent(e) {
if ((e.type === 'keydown' && e.keyCode === 27) || (e.type === 'click' && e.path.indexOf(this.el[0]) === -1)) {
this.activateMenu(true);
}
}
listeners() {
document.addEventListener('keydown', (e) => { this.catchEvent(e) });
document.addEventListener('click', (e) => { this.catchEvent(e) });
}
$onDestroy() {
document.removeEventListener('keydown', (e) => { this.catchEvent(e) });
document.removeEventListener('click', (e) => { this.catchEvent(e) });
}
}
siteMenuController.$inject = ['$element'];
app.component('siteMenu', {
controller: siteMenuController,
bindings: {
items: '<',
className: '@'
},
template,
transclude: true
});
그리고 템플릿 :
<nav class="{{ $ctrl.className }}" ng-class="$ctrl.state ? $ctrl.activeMenuClass : null">
<button class="{{ $ctrl.className }}__trigger" ng-click="$ctrl.state = true">
<span class="{{ $ctrl.className }}__trigger-line"></span>
<span class="{{ $ctrl.className }}__trigger-line"></span>
<span class="{{ $ctrl.className }}__trigger-line"></span>
</button>
<ul class="{{ $ctrl.className }}__wrapper">
<li class="{{ $ctrl.className }}__item" ng-repeat="item in $ctrl.items">
<a class="{{ $ctrl.className }}__link" href="#{{ item.id }}">{{ item.title }}</a>
</li>
</ul>
</nav>
내 문제입니다 - 메뉴를 닫기 위해 - - 트리거를 클릭하면 아무것도 클릭, 좋은 작품 아무튼 ' t (하지만 this.state
변경, 콘솔에서 추적).
어떻게해야합니까?
이런 종류의 동작에는 event.target을 사용해야합니다. – Sam
나는 그런 경우가 아니라고 생각합니다. –