#javascript #html #angularjs
#javascript #HTML #angularjs
Вопрос:
У меня есть всплывающее меню в div.
Я контролирую открытие и закрытие div с помощью: ng-click="showNavMenu = !showNavMenu"
.
Однако для каждой ссылки, где я использую это, мне нужно дублировать этот код, чтобы меню действительно закрывалось после загрузки нового представления.
Я бы хотел избежать этого дублирования кода — есть идеи о том, что я могу сделать:
<div class="navMenu" ng-show="showNavMenu">
<ul>
<li><a href="/about" ng-click="showNavMenu = !showNavMenu">About</a></li>
<li><a href="/privacy" ng-click="showNavMenu = !showNavMenu">Privacy</a></li>
<li><a href="/contact" ng-click="showNavMenu = !showNavMenu">Contact Us</a></li>
</ul>
</div>
Ответ №1:
Вместо этого используйте функцию <li><a href="/about" ng-click="toggleMenu()">About</a></li>
И определите эту функцию в контроллере
$scope.toggleMenu = function() {
$scope.showNavMenu = !$scope.showNavMenu;
}
Комментарии:
1. Но я полагаю, мне все равно нужно было бы упомянуть, что в каждом
ng-click
2. Иногда код получается более подробным, чем хотелось бы. Использование таких инструментов, как bootstrap, упрощает это вместо того, чтобы возиться с низкоуровневым кодом, подобным этому
3. Да, но вам нужно определить обратный вызов только один раз и изменить это поведение также только один раз, когда требования изменятся. Как насчет того, чтобы использовать ‘ng-repeat’, чтобы отображать все ‘li’ аналогичными способами, только со ссылками в href?
Ответ №2:
Как насчет того, чтобы поместить ng-click на родительский ul
? Я не очень хорошо разбираюсь в правилах обработки / распространения событий angular — возможно, вам нужно внести некоторые изменения в вашу функцию или атрибут ng-click. Или это может просто сработать.
function toggleMenu() {
$scope.showNavMenu = !$scope.showNavMenu
}
-----
<ul ng-click="toggleMenu()">
Ответ №3:
Я бы предпочел перенести логику навигации в код контроллера, мне кажется, это самое чистое решение. Таким образом, ваша разметка будет выглядеть как:
<div class="navMenu" ng-show="showNavMenu">
<ul>
<li><a href ng-click="navigate('about')">About</a></li>
<li><a href ng-click="navigate('privacy')">Privacy</a></li>
<li><a href ng-click="navigate('contact')">Contact Us</a></li>
</ul>
</div>
И внутри вашего контроллера:
$scope.navigate = function(path) {
$scope.showNavMenu = false;
window.location.href = '/' path; //better navigate via router
}