ui-router and $state

Post on 18-Dec-2014

1.645 views 0 download

description

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

Transcript of ui-router and $state

ui-router and $state gabe scholz

šŸ‘šŸ‘šŸ‘šŸ˜

who has heard of ui-router? šŸ“ˆ

what is the role of a controller? šŸŽ‰šŸŽˆšŸŽŠ

what is the role of a model?

ui-router > ngRoute !

using routing to control state

agenda šŸ˜

If youā€™re using ngRoute you might be hacking state

into your application. šŸ‘Ž

routes views

dependencies state

bonus features

routes views

dependencies state

bonus features

routes views

dependencies state

bonus features

routes views

dependencies state

bonus features

routes views

dependencies state

bonus features

angular.module(ā€˜appā€™, [ā€˜ngRouteā€™, ā€˜ui.routerā€™]) !.config(function ($routeProvider, $stateProvider) { // DO SOME STUFF!šŸ‘Œ });

housekeeping šŸ”

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

$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

$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

$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

views šŸ“ŗ

presentation.tpl.html presentationSlide.tpl.html

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

routes views dependencies state bonus

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

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

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

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

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

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

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

$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

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

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

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

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

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

$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

ā€œstateā€?šŸ˜’

routes views dependencies state bonus

$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

$state.go(ā€˜presentation.slide.showā€™, { id: 1, slide_id: 2}); !

$state.go(ā€˜user.deleteā€™, {id: 42}); !

$state.go(ā€˜.editā€™);

routes views dependencies state bonus

$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

$state.state abstract: true ā€¦}) .state abstract: true ā€¦}) .state.state.state.state

bonus features šŸ°

www.medium.com/@gabescholz

routes views dependencies state bonus

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

<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

šŸ‘šŸ˜thanks