Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular ui.router default header footer

When it comes to ui.router modules I can think of three different ways to set a default header and footer for every view:

DEFAULT HEADER
<CONTENT>
DEFAULT FOOTER

1. ng-include - attaching your header / footer into your initial .html file (index.html).

<html>
<div ng-include src="'header.html'"></div>
<div id="content" ui-view></div>

1.1. Pasting code into index.html

<html>
<div><!-- my header code here --></div>
<div id="content" ui-view></div>

2. Using directives to parse the header and footer.

home.html

<!-- content -->
<!-- /content -->
<footer></footer>

footerDirective.js

module.directive('footer', function () {
    return {
        restrict: 'E',
        replace: true,
        templateUrl: "footer.html",
        controller: ['$scope', '$filter', function ($scope, $filter) {
        }]
    } 
});

http://gon.to/2013/03/23/the-right-way-of-coding-angularjs-how-to-organize-a-regular-webapp/

3. Creating an extra state on ui.router with no url.

State wrapper would then contain the header and footer and won't be callable.

$stateProvider
.state('wrapper', {
    templateUrl: 'wrapper.html', // contains html of header and footer
    controller: 'WrapperCtrl'
})
.state('wrapper.home', {
    url: '/',
    templateUrl: 'home.html',
    controller: 'HomeCtrl'
});

Which one is preferred? Or, is there a more desirable way to do it with Angular 1.x?

like image 743
zurfyx Avatar asked Dec 29 '15 16:12

zurfyx


1 Answers

There is also another way where you take advantage of the state's views property. It enables one to define multiple named views for a certain state. UI docs.

Consider the below example where state myapp has three named views, where the content view will be the view with dynamic content.

$stateProvider
    .state('myapp', {
        views: {
          'header': {
            template:'header <hr />',
            controller:'mainController as main'
          },
          'content': {
            template:'<div ui-view></div>'
          },
          'footer': {
            template:'<hr /> footer',
            controller:'mainController as main'
          }
       }
   })
  //States below will live in content view
  .state('myapp.one', {
    template:'View 1 <button ui-sref="myapp.two">next page</button>',
    controller:'firstController as first',
  })
  .state('myapp.two', {
    template:'Another page <button ui-sref="myapp.one"> Go back</button>',
    controller:'secondController as second',
  })

And the HTML will look like this:

<div ui-view="header"></div>
<div ui-view="content"><!-- Where your content will live --></div>
<div ui-view="footer"></div>

Jsbin example

like image 150
cbass Avatar answered Sep 29 '22 10:09

cbass