38
ui-router and $state gabe scholz

ui-router and $state

  • Upload
    garbles

  • View
    1.645

  • Download
    0

Embed Size (px)

DESCRIPTION

ui-router is a great replacement for ngRoute that allows you encapsulate your application's state in a single place.

Citation preview

Page 1: ui-router and $state

ui-router and $state gabe scholz

👏👏👏😁

Page 2: ui-router and $state

who has heard of ui-router? 📈

Page 3: ui-router and $state

what is the role of a controller? 🎉🎈🎊

what is the role of a model?

Page 4: ui-router and $state

ui-router > ngRoute !

using routing to control state

agenda 😍

Page 5: ui-router and $state

If you’re using ngRoute you might be hacking state

into your application. 👎

Page 6: ui-router and $state

routes views

dependencies state

bonus features

Page 7: ui-router and $state

routes views

dependencies state

bonus features

Page 8: ui-router and $state

routes views

dependencies state

bonus features

Page 9: ui-router and $state

routes views

dependencies state

bonus features

Page 10: ui-router and $state

routes views

dependencies state

bonus features

Page 11: ui-router and $state

angular.module(‘app’, [‘ngRoute’, ‘ui.router’]) !.config(function ($routeProvider, $stateProvider) { // DO SOME STUFF!👌 });

housekeeping 🏡

Page 12: ui-router and $state

housekeeping 🏡

Presentation id: 1

Slide id: 6 presentation_id: 1

Slide id: 6 presentation_id: 1

Slide id: 6 presentation_id: 1

Slide id: 1,2,3,4

presentation_id: 1

/presentation/:presentation_id/show !/presentation/:presentation_id/slide/:slide_id

Page 13: ui-router and $state

$routeProvider .when(‘/presentation/:id/show’, { templateUrl: ‘presentation.tpl.html', controller: ‘PresentationCtrl’, … }); !$stateProvider .state(‘presentation’, { url: ’/presentation/:id/show’, templateUrl: ‘presentation.tpl.html', controller: ‘PresentationCtrl’, … });

routes 🚗

routes views dependencies state bonus

Page 14: ui-router and $state

$routeProvider .when(‘/presentation/:id/show’, { templateUrl: ‘presentation.tpl.html', controller: ‘PresentationCtrl’, … }) .when(‘/presentation/:id/slides/:slide_id’, { templateUrl: ‘presentationSlide.tpl.html’, controller: ‘PresentationSlideCtrl’, … });

routes 🚗

routes views dependencies state bonus

Page 15: ui-router and $state

$stateProvider .state(‘presentation’, { url: ’/presentation/:id’, templateUrl: ‘presentation.tpl.html', … }) .state(‘presentation.show’, { url: ’/show’, templateUrl: ‘presentationShow.tpl.html', controller: ‘PresentationCtrl’, … }) .state(‘presentation.slide’, { url: ‘/slide/:slide_id’, templateUrl: ‘presentationSlide.tpl.html’, controller: ‘PresentationSlideCtrl’, … });

routes 🚗

routes views dependencies state bonus

Page 16: ui-router and $state

views 📺

presentation.tpl.html presentationSlide.tpl.html

<div ng-view></div><div ng-view></div>

routes views dependencies state bonus

Page 17: ui-router and $state

views 📺presentation.tpl.html

!

$stateProvider .state(‘presentation’, { url: ’/presentation/:id’, templateUrl: ‘presentation.tpl.html’, … }); <div ui-view></div>

<div ui-view></div>

<div class=‘titleBar’>…</div>

<div ui-view></div>

routes views dependencies state bonus

Page 18: ui-router and $state

views 📺presentation.tpl.html

!

$stateProvider .state(‘presentation.slide’, { url: ‘/slide/:slide_id’, controller: … templateUrl: ‘presentationSlide.tpl.html’ … });

<div ui-view></div>presentationSlide.tpl.html

<div class=‘titleBar’>…</div>

<div ui-view></div>

routes views dependencies state bonus

Page 19: ui-router and $state

views 📺presentation.tpl.html

!

$stateProvider .state(‘presentation’, { url: ’/presentation/:id’, controller: … templateUrl: ‘presentation.tpl.html’, … });

<div ui-view></div><div ui-view=‘sideBar’></div>

<div ui-view=‘mainContent’></div>

<div class=‘titleBar’>…</div>

<div ui-view></div>

routes views dependencies state bonus

Page 20: ui-router and $state

presentation.tpl.html !

views 📺

mainContentsideBar

$stateProvider .state(‘presentation.slide’, { url: ’/slide/:slide_id’, views: { ??? }, … });

<div class=‘titleBar’>…</div>

<div ui-view></div>

routes views dependencies state bonus

Page 21: ui-router and $state

views 📺

$stateProvider .state(‘presentation.slide’, { url: ’/slide/:slide_id’, views: { sideBar: { controller: … templateUrl: ‘sideBar.tpl.html’ } }, … });

presentation.tpl.html !

mainContentsideBar.tpl.html

<div class=‘titleBar’>…</div>

<div ui-view></div>

routes views dependencies state bonus

Page 22: ui-router and $state

views 📺$stateProvider .state(‘presentation.slide’, { url: ’/slide/:slide_id’, views: { sideBar: { controller: … templateUrl: ‘sideBar.tpl.html’ }, mainContent: { controller: … templateUrl: ‘mainContent.tpl.html’ } }, … })

presentation.tpl.html !

mainContent.tpl.htmlsideBar.tpl.html

<div class=‘titleBar’>…</div>

<div ui-view></div>

routes views dependencies state bonus

Page 23: ui-router and $state

views 📺

$stateProvider .state(‘presentation.show’, { url: ’/show’, views: { sideBar: { template: ‘’ }, mainContent: { controller: … templateUrl: ‘showContent.tpl.html’ } }, … });

presentation.tpl.html !

showContent.tpl.html

<div class=‘titleBar’>…</div>

<div ui-view></div>

routes views dependencies state bonus

Page 24: ui-router and $state

$routeProvider .when(‘/presentation/:id/show’, { … resolve: { presentation: function ($routeParams, PresentationApi) { return PresentationApi.get($routeParams.id); } } }); !$stateProvider .state(‘presentation’ { url: ‘presentation/:id’, … resolve: { presentation: function ($stateParams, PresentationApi) { return PresentationApi.get($stateParams.id); } } });

dependencies 👶

routes views dependencies state bonus

Page 25: ui-router and $state

angular.module(‘app’, [‘ngRoute’]) !.config(function ($routeProvider) { $routeProvider .when(‘/presentation/:id/show’, { … resolve: { presentation: function ($routeParams, PresentationApi) { return PresentationApi.get($routeParams.id); } } }); }) !.controller(‘PresentationCtrl’, function ($scope, presentation) { $scope.presentation = presentation; });

resolve aside 👯

routes views dependencies state bonus

Page 26: ui-router and $state

angular.module(‘app’, [‘ngRoute’]) !.config(function($routeProvider) { $routeProvider .when(‘/presentation/:id/show’, { … resolve: { presentation: function ($routeParams, PresentationApi) { return PresentationApi.get($routeParams.id); } } }) .when(‘/presentation/:id/slides/:slide_id’, { … resolve: { presentation: function ($routeParams, PresentationApi) { return PresentationApi.get($routeParams.id); } slide: … ??? } }); }); !.controller(‘PresentationSlideCtrl’, function ($scope, slide) { $scope.slide = slide; });

dependencies 👶

routes views dependencies state bonus

Page 27: ui-router and $state

angular.module(‘app’, [‘ngRoute’]) !.controller(‘PresentationSlideCtrl’, function ($scope, slide) { $scope.slide = slide; }); !.controller(‘PresentationSlideCtrl’, function ($scope, $routeParams) { $scope.slide = SlideApi.get($routeParams.slide_id); }); !.controller(‘PresentationSlideCtrl’, function ($scope, $routeParams, presentation) { $scope.slide = presentation.getSlideById($routeParams.slide_id); });

dependencies 👶

routes views dependencies state bonus

Page 28: ui-router and $state

angular.module(‘app’, [‘ngRoute’]) !.controller(‘PresentationSlideCtrl’, function ($scope, slide) { $scope.slide = slide; }); !.controller(‘PresentationSlideCtrl’, function ($scope, $routeParams) { $scope.slide = SlideApi.get($routeParams.slide_id); }); !.controller(‘PresentationSlideCtrl’, function ($scope, $routeParams, presentation) { $scope.slide = presentation.getSlideById($routeParams.slide_id); });

dependencies 👶

routes views dependencies state bonus

Page 29: ui-router and $state

angular.module(‘app’, [‘ngRoute’]) !.controller(‘PresentationSlideCtrl’, function ($scope, slide) { $scope.slide = slide; }); !.controller(‘PresentationSlideCtrl’, function ($scope, $routeParams) { $scope.slide = SlideApi.get($routeParams.slide_id); }); !.controller(‘PresentationSlideCtrl’, function ($scope, $routeParams, presentation) { $scope.slide = presentation.getSlideById($routeParams.slide_id); });

dependencies 👶

routes views dependencies state bonus

Page 30: ui-router and $state

$stateProvider .state(‘presentation’, { … resolve: { presentation: function ($stateParams, PresentationApi) { return PresentationApi.get($stateParams.id); } } }) .state(‘presentation.slide’, { … resolve: { slide: function ($stateParams, presentation) { return presentation.getSlideById($stateParams); } } });

dependencies 👶

routes views dependencies state bonus

Page 31: ui-router and $state

“state”?😒

routes views dependencies state bonus

Page 32: ui-router and $state

$stateProvider .state(‘presentation’, { … controller: function ($scope, presentation) { $scope.presentation = presentation; }, resolve: { presentation: function (…) { PresentationApi.get($stateParams.id); } } }) .state(‘presentation.slide’, {…}) .state(‘presentation.edit’, {…}) .state(‘presentation.show’, {…});

routes views dependencies state bonus

Page 33: ui-router and $state

$state.go(‘presentation.slide.show’, { id: 1, slide_id: 2}); !

$state.go(‘user.delete’, {id: 42}); !

$state.go(‘.edit’);

routes views dependencies state bonus

Page 34: ui-router and $state

$stateProvider .state(‘presentation’, { abstract: true, … }) .state(‘presentation.slide’, { abstract: true, … }) .state(‘presentation.edit’, {…}) .state(‘presentation.show’, {…}) .state(‘presentation.slide.edit’, {…}) .state(‘presentation.slide.show’, {…});

bonus features 🍰

routes views dependencies state bonus

Page 35: ui-router and $state

$state.state abstract: true …}) .state abstract: true …}) .state.state.state.state

bonus features 🍰

www.medium.com/@gabescholz

routes views dependencies state bonus

Page 36: ui-router and $state

angular.module(‘app’, [‘ui.router’]) !.config(function ($stateProvider) { $stateProvider .state(‘presentation.edit’, { data: { permissions: { admin: true } }, … }); }) !.run(function ($rootScope, $state) { var currentUser = $rootScope.currentUser; ! $rootScope.$on(‘$stateChangeStart’, function (…) { if (toState.data.permissions.admin && !currentUser.admin) { event.preventDefault(); $state.go(‘home’); } }); });

bonus features 🍰

routes views dependencies state bonus

Page 37: ui-router and $state

<a ui-sref=“^.slide({slide_id: (slide.id + 1)})”> Next Slide </a> !<a ui-sref=“^.slide({slide_id: (slide.id - 1)})”> Previous Slide </a>

bonus features 🍰

routes views dependencies state bonus

Page 38: ui-router and $state

👏😁thanks