Как использовать угловое ng-hide на основе страницы / маршрута, на котором я сейчас нахожусь?
У меня есть угловое приложение, которое я хочу скрыть одним из "включенных видов", если основным видом является вид домашней страницы.
<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>
3 ответа
Вы можете ввести либо $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>
Плункер: http://plnkr.co/edit/sZlZaz3LQILJcCywB1EB?p=preview
Просто используйте ng-show с отрицательным выражением:
<div id=includedView ng-view="included" ng-show="location != '/main'"></div>
Вам придется установить значение location
на вашем контроллере $scope
в вашем контроллере; возможно, используя $route
или же $location
провайдеры.
Если вы используете маршруты, вы можете запустить некоторую логику при каждом изменении маршрута в 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 в свой контроллер и установить видимость на основе этого.