際際滷

際際滷Share a Scribd company logo
AngularJS: Routing
Single Page Application
Il continuo ricaricamento delle pagine nei siti web
tradizionali:
 disturba la user experience;
 prestazioni generalmente scadenti;
 fastidiose su desktop;
 ingestibili su mobile.
Single Page Application
Le SPA (Single Page Application):
 esperienza di navigazione fluida;
 rendering asincrono di parti della pagina;
 Gmail.
Strumenti maggiormente usati:
 Jquery
 Ajax
Single Page Application
Vantaggi:
 ottima user experience;
 velocit;
 mobile friendly.
Svantaggi:
 ottima conoscenza di javascript;
 strumenti meno evoluti;
 codice meno strutturato.
Single Page Application
SPA con AngularJS
Come gestire il cambio pagina di una single-page application con AngularJs?
<HTML>
...
<div class="container" ng-view>
...
</HTML>
La direttiva ng-view pu嘆 essere vista come un
segnaposto per il modulo $route.
E il posto dove le view verranno innestate.
Route
Per definire le regole di routing bisogna:
 Importare la lib angular-route
<script src=/slideshow/angular-js-routing-50182451/50182451/"angular-route.js">
 Dichiarare la dipendenza dal module ngRoute
var App = angular.module('WorkshopApp',
['ngRoute']);
Route
var App = angular.module('engWs', ['ngRoute']);
App.config(['$routeProvider', function($routeProvider) {
// Le regole di routing vanno definite qui
}]);
$routeProvider.when('/home', {
templateUrl : 'html/home.html'
});
$routeProvider.when('/rubrica', {
templateUrl : 'html/rubrica/lista.html',
controller : 'rubricaController
'
});
Il route di moduli o app va
definito nella funzione config
Per aggiungere un route
specifico dobbiamo usare il
metodo when
Route
$routeProvider.otherwise({redirectTo: '/home'});
Se nessuna regola 竪
soddisfatta, viene chiamato il
metodo otherwise
Route - template o templateUrl
$routeProvider.when('/home', {
template : '<h1>HOME</h1>'
});
$routeProvider.when('/rubrica', {
templateUrl : 'html/rubrica/lista.html',
controller : 'rubricaController
'
});
Posso indicare lurl del template ma
anche definirlo direttamente nella
regola di routing.
Route - Controller
Dov竪 definito rubricaController?
angular.module('engWs')
.controller('rubricaController',
['$scope', '$http', '$location', function($scope, $http,
$location){
//Some logic
}
rubrica-controller.js
<html>

<script type="text/javascript" src=/slideshow/angular-js-routing-50182451/50182451/"rubrica/rubrica-controller.js"></script>
</html>
index.html
Route - Controller
// alternativa poco elegante
$routeProvider.when('/rubrica', {
templateUrl : 'html/rubrica/lista.html',
controller : function($scope){...}
});
Posso scrivere la funzione controller
direttamente nella regola di routing
Resolve
Dati caricati prima del caricamento del controller e del render della view:
 Es. caricamento drop down
$routeProvider.when('/rubrica', {
templateUrl : 'html/rubrica/rubrica.html',
controller : 'rubricaController',
resolve: {
'tipiUtente': ['$http', function($http) {
return $http.get('/api').then(
function success(resp) { return response.data; }
function error(reason) { return false; }
);
}]
}
});
Resolve
// Recupero nel controller
angular.module('engWs')
.controller('rubricaController', ['tipiUtente', ...
function(tipiUtente, ...){
// recupero
$scope.tipiUtente = tipiUtente.data;
}]);
$routeParams
Se in una regola di routing 竪 presente il : AngularJS esclude dalla regola tutto
ci嘆 che viene dopo e lo inserisce in $routeParams
// Regola di routing
$routeProvider.when('/contatto-edit/:id', {
templateUrl : 'rubrica/contatto/dettaglioContatto.html',
controller : 'dettaglioContattoController'
});
$routeParams
// Recupero nel controller
angular.module('engWs')
.controller('dettaglioContattoController', [ '$routeParams', ...
function($routeParams, ...){
// recupero lid
var id = $routeParams.id
}]);
$location
Servizio che integra windows.location nellapplicazione Angular.
Metodi:
 path - get del path corrente
o $location.path(); // returns the current path
o $location.path('/'); // change the path to the '/' route
 replace - redirect con return button disabilitato (es. dopo il login)
o $location.path('/home').replace();
 host - host dellurl corrente
o $location.host(); // host of the current url
 ...
Active menu
<body ng-app="engWs" ng-controller="indexController">
...
<ul class="nav navbar-nav">
<li ng-class="isActive('/rubrica')"><a href="#rubrica">Rubrica</a></li>
<li ng-class="isActive('/auth')"><a href="#auth">Autenticazione</a></li>
<li ng-class="isActive('/sicurezza')"><a href="#sicurezza">Sicurezza</a></li>
</ul>
...
</body>
Active menu
angular.module('engWs')
.controller('indexController', ['$scope', '$location', function($scope, $location)
{
// definizione variabile globale per gestione active menu
$scope.isActive = function(path) {
if ($location.path().substr(0, path.length) == path) {
return "active";
} else {
return "";
}
};
}]);
Routing Modes
Determina come deve essere lURL del sito:
 Hashbang Mode, (default)
o http://yoursite.com/#/inbox/all
angular.module('myApp', ['ngRoute'])
.config(['$locationProvider', function($locationProvider) {
$locationProvider.html5Mode(false); // non indispensabile
$locationProvider.hashPrefix('!');
}]);
o http://yoursite.com/#!/inbox/all
Routing Modes
Determina come deve essere lURL del sito:
 HTML5 Mode, aspetto di URL regolare tranne che nei
browser pi湛 vecchi
o http://yoursite.com/inbox/all
angular.module('myApp', ['ngRoute'])
.config(['$locationProvider', function($locationProvider) {
$locationProvider.html5Mode(true); // indispensabile
}]);
Routing Modes - Example
Link: <a href="/rubrica/">Person</a>
 Hashbang /index.html#/rubrica
 HTML5 /index.html/rubrica
Routing Modes - Base Url
E possibile settare lURL base nellhead dellHTML
<html>
<head>
<base href="/base/url" />
</head>

</html>
Routing Events
E possibile introdurre comportamenti custom in diversi
momenti del flusso di routing:
 $routeChangeStart, avviene quando il route service
inizia a risolvere tutte le dipendenze (resolve)
angular.module('myApp', [])
.run(['$rootScope', '$location',
function($rootScope, $location) {
$rootScope.$on('$routeChangeStart',
function(evt, next, current) {
})
}])
evt 竪 levento
next e current sono rispettivamente il
nuovo route e quello corrente
Routing Events
 $routeChangeSuccess, avviene quando il route service
ha risolto tutte le dipendenze (resolve)
angular.module('myApp', [])
.run(['$rootScope', '$location',
function($rootScope, $location) {
$rootScope.$on('$routeChangeSuccess',
function(evt, next, previous) {
})
}])
evt 竪 levento
next e previous sono rispettivamente
il nuovo route e quello precedente
Routing Events
 $routeChangeError, avviene in caso di errore
angular.module('myApp', [])
.run(['$rootScope', '$location',
function($rootScope, $location) {
$rootScope.$on('$routeChangeError',
function(current, previous, rejection)
{
})
}])
current, route corrente
previous, route precedente
rejection, 竪 lerrore

More Related Content

Angular js: routing

  • 2. Single Page Application Il continuo ricaricamento delle pagine nei siti web tradizionali: disturba la user experience; prestazioni generalmente scadenti; fastidiose su desktop; ingestibili su mobile.
  • 3. Single Page Application Le SPA (Single Page Application): esperienza di navigazione fluida; rendering asincrono di parti della pagina; Gmail. Strumenti maggiormente usati: Jquery Ajax
  • 4. Single Page Application Vantaggi: ottima user experience; velocit; mobile friendly. Svantaggi: ottima conoscenza di javascript; strumenti meno evoluti; codice meno strutturato.
  • 6. SPA con AngularJS Come gestire il cambio pagina di una single-page application con AngularJs? <HTML> ... <div class="container" ng-view> ... </HTML> La direttiva ng-view pu嘆 essere vista come un segnaposto per il modulo $route. E il posto dove le view verranno innestate.
  • 7. Route Per definire le regole di routing bisogna: Importare la lib angular-route <script src=/slideshow/angular-js-routing-50182451/50182451/"angular-route.js"> Dichiarare la dipendenza dal module ngRoute var App = angular.module('WorkshopApp', ['ngRoute']);
  • 8. Route var App = angular.module('engWs', ['ngRoute']); App.config(['$routeProvider', function($routeProvider) { // Le regole di routing vanno definite qui }]); $routeProvider.when('/home', { templateUrl : 'html/home.html' }); $routeProvider.when('/rubrica', { templateUrl : 'html/rubrica/lista.html', controller : 'rubricaController ' }); Il route di moduli o app va definito nella funzione config Per aggiungere un route specifico dobbiamo usare il metodo when
  • 9. Route $routeProvider.otherwise({redirectTo: '/home'}); Se nessuna regola 竪 soddisfatta, viene chiamato il metodo otherwise
  • 10. Route - template o templateUrl $routeProvider.when('/home', { template : '<h1>HOME</h1>' }); $routeProvider.when('/rubrica', { templateUrl : 'html/rubrica/lista.html', controller : 'rubricaController ' }); Posso indicare lurl del template ma anche definirlo direttamente nella regola di routing.
  • 11. Route - Controller Dov竪 definito rubricaController? angular.module('engWs') .controller('rubricaController', ['$scope', '$http', '$location', function($scope, $http, $location){ //Some logic } rubrica-controller.js <html> <script type="text/javascript" src=/slideshow/angular-js-routing-50182451/50182451/"rubrica/rubrica-controller.js"></script> </html> index.html
  • 12. Route - Controller // alternativa poco elegante $routeProvider.when('/rubrica', { templateUrl : 'html/rubrica/lista.html', controller : function($scope){...} }); Posso scrivere la funzione controller direttamente nella regola di routing
  • 13. Resolve Dati caricati prima del caricamento del controller e del render della view: Es. caricamento drop down $routeProvider.when('/rubrica', { templateUrl : 'html/rubrica/rubrica.html', controller : 'rubricaController', resolve: { 'tipiUtente': ['$http', function($http) { return $http.get('/api').then( function success(resp) { return response.data; } function error(reason) { return false; } ); }] } });
  • 14. Resolve // Recupero nel controller angular.module('engWs') .controller('rubricaController', ['tipiUtente', ... function(tipiUtente, ...){ // recupero $scope.tipiUtente = tipiUtente.data; }]);
  • 15. $routeParams Se in una regola di routing 竪 presente il : AngularJS esclude dalla regola tutto ci嘆 che viene dopo e lo inserisce in $routeParams // Regola di routing $routeProvider.when('/contatto-edit/:id', { templateUrl : 'rubrica/contatto/dettaglioContatto.html', controller : 'dettaglioContattoController' });
  • 16. $routeParams // Recupero nel controller angular.module('engWs') .controller('dettaglioContattoController', [ '$routeParams', ... function($routeParams, ...){ // recupero lid var id = $routeParams.id }]);
  • 17. $location Servizio che integra windows.location nellapplicazione Angular. Metodi: path - get del path corrente o $location.path(); // returns the current path o $location.path('/'); // change the path to the '/' route replace - redirect con return button disabilitato (es. dopo il login) o $location.path('/home').replace(); host - host dellurl corrente o $location.host(); // host of the current url ...
  • 18. Active menu <body ng-app="engWs" ng-controller="indexController"> ... <ul class="nav navbar-nav"> <li ng-class="isActive('/rubrica')"><a href="#rubrica">Rubrica</a></li> <li ng-class="isActive('/auth')"><a href="#auth">Autenticazione</a></li> <li ng-class="isActive('/sicurezza')"><a href="#sicurezza">Sicurezza</a></li> </ul> ... </body>
  • 19. Active menu angular.module('engWs') .controller('indexController', ['$scope', '$location', function($scope, $location) { // definizione variabile globale per gestione active menu $scope.isActive = function(path) { if ($location.path().substr(0, path.length) == path) { return "active"; } else { return ""; } }; }]);
  • 20. Routing Modes Determina come deve essere lURL del sito: Hashbang Mode, (default) o http://yoursite.com/#/inbox/all angular.module('myApp', ['ngRoute']) .config(['$locationProvider', function($locationProvider) { $locationProvider.html5Mode(false); // non indispensabile $locationProvider.hashPrefix('!'); }]); o http://yoursite.com/#!/inbox/all
  • 21. Routing Modes Determina come deve essere lURL del sito: HTML5 Mode, aspetto di URL regolare tranne che nei browser pi湛 vecchi o http://yoursite.com/inbox/all angular.module('myApp', ['ngRoute']) .config(['$locationProvider', function($locationProvider) { $locationProvider.html5Mode(true); // indispensabile }]);
  • 22. Routing Modes - Example Link: <a href="/rubrica/">Person</a> Hashbang /index.html#/rubrica HTML5 /index.html/rubrica
  • 23. Routing Modes - Base Url E possibile settare lURL base nellhead dellHTML <html> <head> <base href="/base/url" /> </head> </html>
  • 24. Routing Events E possibile introdurre comportamenti custom in diversi momenti del flusso di routing: $routeChangeStart, avviene quando il route service inizia a risolvere tutte le dipendenze (resolve) angular.module('myApp', []) .run(['$rootScope', '$location', function($rootScope, $location) { $rootScope.$on('$routeChangeStart', function(evt, next, current) { }) }]) evt 竪 levento next e current sono rispettivamente il nuovo route e quello corrente
  • 25. Routing Events $routeChangeSuccess, avviene quando il route service ha risolto tutte le dipendenze (resolve) angular.module('myApp', []) .run(['$rootScope', '$location', function($rootScope, $location) { $rootScope.$on('$routeChangeSuccess', function(evt, next, previous) { }) }]) evt 竪 levento next e previous sono rispettivamente il nuovo route e quello precedente
  • 26. Routing Events $routeChangeError, avviene in caso di errore angular.module('myApp', []) .run(['$rootScope', '$location', function($rootScope, $location) { $rootScope.$on('$routeChangeError', function(current, previous, rejection) { }) }]) current, route corrente previous, route precedente rejection, 竪 lerrore

Editor's Notes

  1. strumenti meno evoluti: Non ci sono ide di sviluppo paragonabili ad esempio a VS per le tecnologie lato client ma i nuovi software stanno facendo passi da gigante (es. WebStorm); codice meno strutturato: solitamente le SPA sono implementate con jquery e ajax. Approccio imperativo
  2. Per segnalare ad angular dove renderizzare lHTML del template che vogliamo visualizzare abbiamo bisogno della direttiva ng-view e del modulo $route
  3. Il servizio $location risolve il problema adattando lURL per i browser pi湛 vecchi. In sostanza usa la modalit Hashbang