Адаптивное навигационное меню AngularJS скрывает контент в ng-view

Вот мой основной вид в index.html:

<body>
    <div id = "container">
        <header ng-controller = "NavController" >
            <nav id = "topNavBar" class = "topNav" ng-class = "{'responsive' : toggle}">
                <a href = "#/" ng-click = "toggle = false" ng-class = "{active: isActive('')}">Home</a>
                <a href = "#/about" ng-click = "toggle = false" ng-class = "{active: isActive('about')}">About</a>
                <a href = "#/gallery" ng-click = "toggle = false" ng-class = "{active: isActive('gallery')}">Gallery</a>
                <a href = "#/contact" ng-click = "toggle = false" ng-class = "{active: isActive('contact')}">Contact</a>
                <a href = "#" id = "menuIcon" ng-click = "toggle = !toggle">
                    <i class = "fa fa-bars"></i>
                </a>
            </nav>
        </header>
        <div ng-view></div>
    </div>
    <script src = "js/app.js"></script>
</body>

Вот мой CSS для меню навигации:

.topNav {
  overflow: hidden;
  background-color: #333;
}

.topNav a {
  float: left;
  display: block;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  font-size: 17px;
}

.topNav a:hover {
  background-color: #ddd;
  color: black;
}

.topNav a.active {
  background-color: #4CAF50;
  color: white;
}

.topNav #menuIcon {
  display: none;
}

@media screen and (max-width: 600px) {
  .topNav a:not(:first-child) {display: none;}
  .topNav a#menuIcon {
    float: right;
    display: block;
  }
}

@media screen and (max-width: 600px) {
  .topNav.responsive {position: relative;}
  .topNav.responsive #menuIcon {
    position: absolute;
    right: 0;
    top: 0;
  }
  .topNav.responsive a {
    float: none;
    display: block;
    text-align: left;
  }
}

А вот и app.js:

var app = angular.module('myApp', ['ngRoute']);

app.config(function($routeProvider) {
  $routeProvider

  .when('/', {
    templateUrl : 'pages/home.html',
    controller  : 'HomeController'
  })

  .when('/about', {
    templateUrl : 'pages/about.html',
    controller  : 'AboutController'
  })

  .when('/gallery', {
    templateUrl : 'pages/gallery.html',
    controller  : 'GalleryController'
  })

  .when('/contact', {
    templateUrl : 'pages/contact.html',
    controller  : 'ContactController'
  })

  .otherwise({redirectTo: '/'});
});

app.controller('NavController', function($scope, $location) { 
    $scope.isActive = function(page) {
        return $location.path().substring(1) == page;
    }

    $scope.toggle = false;
});

app.controller('HomeController', function($scope, $http) {
    // Code for HomeController
});

app.controller('AboutController', function($scope) {
  // Code for AboutController
});

app.controller('GalleryController', function($scope, $http) {
    // Code for GalleryController
});

app.controller('ContactController', function($scope) {
    // Code for ContactController
});

Когда размер экрана меньше 600 пикселей, мое меню навигации сворачивается и отображает кнопку меню. У меня был рабочий jQuery, который запускал раскрывающееся меню при нажатии кнопки меню:

$("#menuIcon").on('click', function() {
    $("#topNavBar").toggleClass('responsive');
});

Моя версия Angular ведет себя следующим образом:

  1. Когда вы нажимаете кнопку меню, появляется раскрывающееся меню (хорошо), но все содержимое в ng-view исчезает (плохо)
  2. Когда вы нажимаете кнопку меню второй раз, раскрывающееся меню сворачивается (хорошо)
  3. Когда вы выполняете №1, а затем щелкаете ссылку в меню, соответствующая страница загружается правильно, а раскрывающееся меню сворачивается (хорошо)

Как это исправить?

ОБНОВЛЕНИЕ: решено

  1. Перешел с AngularJS 1.4 на последнюю версию 1.7.5 (не уверен, почему я использовал 1.4 ....)
  2. Обновлены навигационные ссылки: href = "#! / ..." вместо href = "# / ..."
  3. Удален href = "#" из кнопки раскрывающегося меню (вероятно, это была основная причина моей проблемы)
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Директивы позволяют расширять HTML новыми элементами и атрибутами и даже создавать собственные структурные директивы для манипулирования DOM. С...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
1
0
271
1

Ответы 1

У меня была такая же проблема, и это помогло мне ее исправить!

Я скопировал свою разметку из https://github.com/googlearchive/angularfire-seed/blob/master/app/index.html, а раскрывающееся меню панели навигации скопировано из примера начальной загрузки, который я где-то нашел:

    <div class = "collapse navbar-collapse">
      <ul class = "nav navbar-nav navbar-right">
        <li class = "dropdown" ng-show = "isLoggedIn">
          <a href = "#" class = "dropdown-toggle" data-toggle = "dropdown">
            {{ user.name }}<b class = "caret"></b>
          </a>
          <ul class = "dropdown-menu">
            <li><a href = "" ng-click = "changePassword()">Change Password</a></li>
            <li><a href = "" ng-click = "logout()">Logout</a></li>
          </ul>
        </li>
      </ul>
      ...
    </div>

Проблема в том, что когда пользователь щелкает раскрывающийся список, он регистрируется как щелчок по элементу <a> и меняет URL-адрес на /#, что изменяет содержимое, отображаемое в основном блоке содержимого.

Удаление href = "#" из <a href = "#" class = "dropdown-toggle" data-toggle = "dropdown"> устранило для меня проблему, поэтому теперь URL-адрес не меняется (и, таким образом, основное содержимое не исчезает из блока <div ng-view>), когда пользователь щелкает раскрывающийся список!

      <a class = "dropdown-toggle" data-toggle = "dropdown">

Другие вопросы по теме