Как использовать angular ng-hide на основе страницы/маршрута, в которой я сейчас?
имеет приложение angular, которое я хочу скрыть один из "включенных представлений", если основным видом является просмотр домашней страницы.
<div id="page" ng-class="{ showNav: $root.showNav }">
<header id="pageHeader" ng-controller="HeaderCtrl" data-ng-include="'views/includes/header.html'"></header>
<div id="pageHero" ng-show='$rootScope.fullView' ng-controller="MainsearchCtrl" data-ng-include="'views/mainSearch.html'"></div>
<div id="pageContent" ng-view=""></div>
</div>
Ответы
Ответ 1
Вы можете ввести либо $route
, либо $location
в свой контроллер, извлечь необходимое значение из одной из этих служб и использовать его в ng-show
или ng-if
.
Пример использования $route
и $location
вы можете увидеть здесь.
Вот один из возможных способов сделать это:
JavaScript
angular.module('app', ['ngRoute']).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/one', {
controller: 'routeController',
templateUrl: 'routeTemplate.html'
}).
when('/two', {
controller: 'routeController',
templateUrl: 'routeTemplate.html'
}).
otherwise({
redirectTo: '/one'
})
}]).
controller('routeController', ['$scope', '$location', function($scope, $location) {
$scope.showPageHero = $location.path() === '/one';
}]);
routeTemplate.html
<div>
<h1>Route Template</h1>
<div ng-include="'hero.html'" ng-if="showPageHero"></div>
<div ng-include="'content.html'"></div>
</div>
Plunker: http://plnkr.co/edit/sZlZaz3LQILJcCywB1EB?p=preview
Ответ 2
Просто используйте ng-show с отрицательным выражением:
<div id=includedView ng-view="included" ng-show="location != '/main'"></div>
Вам нужно будет установить значение location
на вашем контроллере $scope
в вашем контроллере; возможно, используя поставщиков $route
или $location
.
Ответ 3
Если вы используете маршруты, вы можете запустить некоторую логику при каждом изменении маршрута в блоке resolve
в маршрутизаторе.
В приведенном ниже примере я использую настраиваемую службу SystemService, которая хранит это местоположение и, в свою очередь, транслирует событие на $rootScope. В этом примере навигация находится за пределами представлений, управляемых маршрутизируемыми контроллерами, и имеет свой собственный контроллер:
app.config(['$routeProvider',
function($routeProvider) {
$routeProvider.
when('/', {
templateUrl: 'partials/welcome.html',
controller: 'WelcomeCtrl',
resolve: {
load: function(SystemService){
SystemService.fireNavEvent({showNav:false,location:'/'});
}
}
}).
when('/other', {
templateUrl: 'partials/other.html',
controller: 'ElseCtrl',
resolve: {
load: function(SystemService){
SystemService.fireNavEvent({showNav:true,location:'/other'});
}
}
}).
otherwise({
redirectTo: '/'
});
}]);
//в SystemServce:
function fireNavEvent(obj){
this.showNav = obj.showNav;
$rootScope.$broadcast('navEvent',obj);
}
//затем в контроллере навигации:
$scope.$on("navEvent", function(evt,args){
$scope.showNav = SystemService.showNav;
// also some logic to set the active nav item based on location
});
Есть и другие способы достижения этой цели, например, вы можете просто транслировать изменения навигации на $rootScope
непосредственно из конфигурации маршрутов.
Вы также можете ввести $location в свой контроллер и установить видимость на основе этого.