18

have an angular application that I want to hide one of the 'included views' if the main view is the homepage view.

<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>
silvster27
  • 1,916
  • 6
  • 30
  • 44

3 Answers3

21

You can inject either $route or $location into your controller, fetch needed value from one of these services and use it in ng-show or ng-if.

Example of using $route and $location you can see here.

Here is one of possible ways of doing it:

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

Vadim
  • 8,701
  • 4
  • 43
  • 50
  • This is exacly what I am looking to do, only the div that contains teh ng-if is actually on the index page and therefore is not working. – silvster27 Mar 13 '14 at 22:01
  • Is it valid to have multiple $scope methods within the controller? Example: `controller('routeController', ['$scope', '$location', function($scope, $location) { $scope.showPageHero = $location.path() === '/one'; $scope.showNewHeader = $location.path() === '/two'; }]);` – Kyle Vassella Dec 17 '16 at 20:28
  • 1
    @KyleVassella Sure, these are not methods, but boolean values, and you may have multiple of them on the same `$scope`. So, it's totally valid. – Vadim Dec 18 '16 at 07:25
5

Just use ng-show with a negative expression:

<div id=includedView ng-view="included" ng-show="location != '/main'"></div>

You'll have to set the value of location on your controller $scope in your controller; possibly using the $route or $location providers.

John Weldon
  • 39,849
  • 11
  • 94
  • 127
  • 1
    Not really a very useful answer unless you already understand `$route` and `$location`. In which case you can probably figure this out for yourself. – bert Sep 14 '16 at 10:05
2

If you use routes you can run some logic on each route change in the resolve block in the routeprovider.

In the example below I'm using a custom SystemService service that stores the location and in turn broadcasts an event on $rootScope. In this example the navigation is outside of the views managed by the routed controllers and has its own controller:

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: '/'
  });
}]);

// in SystemServce:

function fireNavEvent(obj){
    this.showNav = obj.showNav;
    $rootScope.$broadcast('navEvent',obj);
}

// then in the navigtion controller:

$scope.$on("navEvent", function(evt,args){
  $scope.showNav = SystemService.showNav;
  // also some logic to set the active nav item based on location
});

There are other ways to achieve this, for example you could just broadcast the navigation change on $rootScope directly from the routes config.

You could also inject $location into your controller and set the visibility based on that.

Ade
  • 2,961
  • 4
  • 30
  • 47