Post on 18-Dec-2014
description
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