© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Introduction to SPAs with AngularJS @LaurentDuveau AngularAcademy.ca
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 I have been creating web sites for 20 years… 1995 My JavaScript won’t work in Netscape! 2015 Still doing JavaScript… … but with
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Agenda • SPA ? • AngularJS ? • Setup and first project • Modules • Controllers • Directives • Filters • Navigation with Routing • Services • REST API
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 SPA ?
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Single Page Application Not an app with a single page… Different views loaded into a screen without reloading everything from scratch + routing, history, two-way data binding, dependency injection, … SPA are client-centric application… so coded with JavaScript … lots of JavaScript… rely on a Framework!
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 AngularJS ? 100% JavaScript Framework Created in October 2010 by developers inside Google Final first version in June 2012 Open Source, MIT license Compatible with IE 9+ and others modern browsers
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Wait… another Js framework ?
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Another Js framework, really !?? “there are more JavaScript frameworks than JavaScript developers”
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Js frameworks… Google Trends http://www.google.com/trends/explore?hl=en#q=backbone.js,+angularjs,+ember.js,+knockout.js &cmpt=q
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 SETUP AND FIRST SAMPLE!
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Setup index.html
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 First sample index.htmlbinding directives
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 The ng-* attributes Angular Directives • Custom HTML elements (standard!) • Ignored by browsers, processed by Angular • Manage events and DOM interactions • Can have its own controller and template
© LDEX, 2015 JavaScript Open Day Montreal, November 2015
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 MODULES
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Modules • Angular code is written in modules • Better decoupling, maintenance and testability • A module can use other modules dependenciesmodule name AngularJS!
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Modules index.html app.js
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Modules index.html app.js runs this module when page load dependencies none, for now…
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 CONTROLLERS
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Controller • Behavior of the application specified in controllers with functions and variables controller in the module good practice: write your code in an Immediately Invoked Function Expression (IIFE) app.js
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Controller index.html directive controller name alias controller scope binding app.js
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Controller index.html directive controller name alias controller scope binding app.js
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 DEMO!
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 DIRECTIVES
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives • ng-model directive
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives • Add a button with ng-click index.html
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives • Add a button with ng-click index.html
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives • ng-disabled directive app.js index.html
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives • ng-disabled directive app.js index.html
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives • ng-hide directive index.html app.js
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives products array app.js
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives • ng-repeat directive index.html
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives • ng-repeat directive index.html
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives • ng-class directive index.html styles.css
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Directives • ng-class directive index.html styles.css
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 FILTERS
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Filters index.html formats for currency, date, … app.js
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Filters index.html formats for currency, date, … app.js
© LDEX, 2015 JavaScript Open Day Montreal, November 2015
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Bidirectional data binding! When ng-click changes… …the expression {{store.displayLimit}} (and limitTo) is automatically updated!
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 ROUTING
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Routing ? • Split a page in views and navigate between them. About Us View ng-view (placeholder) Index.html My App Contact Us View #/About #/Contact
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Routing with ngRoute • Import angular-route.js • Inject ngRoute into the module • Define the routes var app = angular.module('store', ['store-products', 'ngRoute']); app.config(["$routeProvider", function ($routeProvider) { $routeProvider.when("/", { controller: "StoreController", controllerAs: "storeCtrl", templateUrl: "/views/productsList.html" }) .when("/product/:id", { controller: "ProductController", controllerAs: "productCtrl", templateUrl: "/views/productView.html" }) .otherwise({ redirectTo: "/" }); }]); mysite.com/index.html#/product/1 mysite.com/index.html everything else…
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Routing with ngRoute • Get Route parameter in the controller • Use ngView in your page <body> <div ng-view=""></div> . . . </body> index.html app.controller('ProductController', function ($routeParams, dataService) { dataService.getProductById($routeParams.id) .then(function (product) { . . . products.js
© LDEX, 2015 JavaScript Open Day Montreal, November 2015
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 SERVICES
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Services • Shares functionality and data between controllers • Avoids code redundancy • Implemented as singletons (single instance) • AngularJS comes with built-in services ($http, $route, $log, $q, $resource, etc.)
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 $resource and REST API angular.module('store', ['ngResource']) .factory('Product', function($resource) { return $resource('/api/product/:id'); }) .controller('MainCtrl', function(Product) { var vm = this; // Get all products vm.products = Product.query(); // Form data for creating a new product with ng-model vm.productData = {}; vm.newProduct = function() { var product = new Product(vm.productData); product.$save(); } }); also get(), remove(), delete()
© LDEX, 2015 JavaScript Open Day Montreal, November 2015
© LDEX, 2015 JavaScript Open Day Montreal, November 2015
© LDEX, 2015 JavaScript Open Day Montreal, November 2015 Angular Training: 3-day course in Canada!

Introduction to SPAs with AngularJS

  • 1.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Introduction to SPAs with AngularJS @LaurentDuveau AngularAcademy.ca
  • 2.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 I have been creating web sites for 20 years… 1995 My JavaScript won’t work in Netscape! 2015 Still doing JavaScript… … but with
  • 3.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Agenda • SPA ? • AngularJS ? • Setup and first project • Modules • Controllers • Directives • Filters • Navigation with Routing • Services • REST API
  • 4.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 SPA ?
  • 5.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Single Page Application Not an app with a single page… Different views loaded into a screen without reloading everything from scratch + routing, history, two-way data binding, dependency injection, … SPA are client-centric application… so coded with JavaScript … lots of JavaScript… rely on a Framework!
  • 6.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 AngularJS ? 100% JavaScript Framework Created in October 2010 by developers inside Google Final first version in June 2012 Open Source, MIT license Compatible with IE 9+ and others modern browsers
  • 7.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Wait… another Js framework ?
  • 8.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Another Js framework, really !?? “there are more JavaScript frameworks than JavaScript developers”
  • 9.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Js frameworks… Google Trends http://www.google.com/trends/explore?hl=en#q=backbone.js,+angularjs,+ember.js,+knockout.js &cmpt=q
  • 10.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 SETUP AND FIRST SAMPLE!
  • 11.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Setup index.html
  • 12.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 First sample index.htmlbinding directives
  • 13.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 The ng-* attributes Angular Directives • Custom HTML elements (standard!) • Ignored by browsers, processed by Angular • Manage events and DOM interactions • Can have its own controller and template
  • 14.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015
  • 15.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 MODULES
  • 16.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Modules • Angular code is written in modules • Better decoupling, maintenance and testability • A module can use other modules dependenciesmodule name AngularJS!
  • 17.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Modules index.html app.js
  • 18.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Modules index.html app.js runs this module when page load dependencies none, for now…
  • 19.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 CONTROLLERS
  • 20.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Controller • Behavior of the application specified in controllers with functions and variables controller in the module good practice: write your code in an Immediately Invoked Function Expression (IIFE) app.js
  • 21.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Controller index.html directive controller name alias controller scope binding app.js
  • 22.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Controller index.html directive controller name alias controller scope binding app.js
  • 23.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 DEMO!
  • 24.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 DIRECTIVES
  • 25.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives • ng-model directive
  • 26.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives • Add a button with ng-click index.html
  • 27.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives • Add a button with ng-click index.html
  • 28.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives • ng-disabled directive app.js index.html
  • 29.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives • ng-disabled directive app.js index.html
  • 30.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives • ng-hide directive index.html app.js
  • 31.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives products array app.js
  • 32.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives • ng-repeat directive index.html
  • 33.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives • ng-repeat directive index.html
  • 34.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives • ng-class directive index.html styles.css
  • 35.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Directives • ng-class directive index.html styles.css
  • 36.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 FILTERS
  • 37.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Filters index.html formats for currency, date, … app.js
  • 38.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Filters index.html formats for currency, date, … app.js
  • 39.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015
  • 40.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Bidirectional data binding! When ng-click changes… …the expression {{store.displayLimit}} (and limitTo) is automatically updated!
  • 41.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 ROUTING
  • 42.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Routing ? • Split a page in views and navigate between them. About Us View ng-view (placeholder) Index.html My App Contact Us View #/About #/Contact
  • 43.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Routing with ngRoute • Import angular-route.js • Inject ngRoute into the module • Define the routes var app = angular.module('store', ['store-products', 'ngRoute']); app.config(["$routeProvider", function ($routeProvider) { $routeProvider.when("/", { controller: "StoreController", controllerAs: "storeCtrl", templateUrl: "/views/productsList.html" }) .when("/product/:id", { controller: "ProductController", controllerAs: "productCtrl", templateUrl: "/views/productView.html" }) .otherwise({ redirectTo: "/" }); }]); mysite.com/index.html#/product/1 mysite.com/index.html everything else…
  • 44.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Routing with ngRoute • Get Route parameter in the controller • Use ngView in your page <body> <div ng-view=""></div> . . . </body> index.html app.controller('ProductController', function ($routeParams, dataService) { dataService.getProductById($routeParams.id) .then(function (product) { . . . products.js
  • 45.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015
  • 46.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 SERVICES
  • 47.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Services • Shares functionality and data between controllers • Avoids code redundancy • Implemented as singletons (single instance) • AngularJS comes with built-in services ($http, $route, $log, $q, $resource, etc.)
  • 48.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 $resource and REST API angular.module('store', ['ngResource']) .factory('Product', function($resource) { return $resource('/api/product/:id'); }) .controller('MainCtrl', function(Product) { var vm = this; // Get all products vm.products = Product.query(); // Form data for creating a new product with ng-model vm.productData = {}; vm.newProduct = function() { var product = new Product(vm.productData); product.$save(); } }); also get(), remove(), delete()
  • 49.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015
  • 50.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015
  • 51.
    © LDEX, 2015JavaScript Open Day Montreal, November 2015 Angular Training: 3-day course in Canada!