AngularJs: Скрыть элемент навигации по маршруту?

Я пытаюсь выяснить, как показать или скрыть элемент в моем навигаторе на основе маршрута или отображаемое текущее представление. Например, у меня есть базовая/расширенная кнопка переключения, которую я помещаю в навигационную панель (Bootstrap 3), когда пользователь находится в форме поиска. Но когда они находятся в другом месте приложения, кнопка переключения должна быть скрыта.

В терминах DOM это просто элемент списка, который создает навигацию. Я не уверен, следует ли показывать или скрывать на основе глобального значения, которое устанавливается на каждом представлении, или я могу просто использовать имя маршрута или представления. Если да, то как это работает?

Спасибо!

Ответ 1

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

$scope.isActive = function(viewLocation) {
    return viewLocation === $location.path();
};

(В приведенном выше коде используется служба Angular $location)

Затем в шаблоне вы можете показать/скрыть на основе результата вызова (передача маршрута, который должен отображать элемент):

ng-show="isActive('/search-form')"

Ответ 2

Здесь подход, который я использовал с ui-router:

Я только хочу скрыть навигационную панель для небольшого количества страниц, поэтому я пошел с отключенным свойством в состояниях (состояниях), которые я хочу скрыть навигация.

.state('photos.show', {
  url: '/{photoId}',
  views: {
    "@" : {
      templateUrl: 'app/photos/show/index.html',
      controller: 'PhotoController'
    }
  },
  hideNavbar: true
})

Inject $state в вашем навигационном контроллере и поместите его в шаблон:

$scope.state = $state;

Затем добавьте ng-hide в шаблон вашего навигатора:

<nav ng-hide="state.$current.hideNavbar" ...

Ответ 3

Над работами отлично используя ui-router, не забудьте передать $scope и $state в свою функцию

Пример:

    app.controller('LoginCtrl', function($scope, $state){
        $scope.state = $state;
        console.log($state); // this will return the current state object just in case you need to see whats going on for newbies like me :)
    });