ui-router and $state

38
ui-router and $state gabe scholz

Upload: garbles

Post on 18-Dec-2014

1.647 views

Category:

Technology


0 download

DESCRIPTION

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

TRANSCRIPT

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