From zero to HERO with Trifon Statkov About me Trifon Statkov Software developer at Co-owner at @Tricho340 The “Plan” I will make you feel confident using Angular JS in less than 60 minutes Presentation comprises of 3 parts: Part I. Absolute introduction to Angular JS Part II. Angular JS building blocks Part III. Some coding Part I. Absolute introduction to Angular JS Angular JS facts (1) Open-source JavaScript framework Developed in 2009 by Miško Hevery and Adam Abrons Maintained by Google Actively developed and supported Why use it? The problem – HTML is great for static pages, but has no tools for web applications The solution – extend and adapt HTML vocabulary with some additional declarations that are useful for web applications More benefits Less boilerplate code Less effort in mundane tasks allowing for better focus on what is ACTUALLY VALUABLE – THE LOGIC More efficiency in development Separation of concerns Some more details Uses JQLite (a subset of JQuery) for DOM manipulations If you include jQuery before Angular, it will be used instead of JQLite Part II. Angular JS building blocks Angular JS is MVC MVC = Model-View-Controller Less dependencies Improves maintainability It is easier to read and understand code M for Model Holds the data Notifies the View and the Controller for changes in the data Does not know about the View and the Controller V for View Displays stuff (buttons, labels, …) This is what your users will see Knows about the Model Usually displays something related to the current state of the Model C for Controller Controls everything Knows about both the Model and the View The “logic” resides in it What to happen, when and how Two-way data binding View is updated automatically when the Model is changed Model is updated automatically when a value in the View has changed No DOM manipulation boilerplate needed! Two-way data binding illustrated Dependency Injection No more “global” objects Classes will get the objects they need (their dependencies) in order to work Anatomy of an Angular application (1) Controllers Models Services Directives Modules Filters Factories Scopes Templates Routes Animations Controllers in Angular JS Define the application’s behaviour What to put in the Controller? Focus on the application logic Don’t worry about the Model – Angular JS will take care of it Controllers in Angular JS (example) The Scope object ($scope) (1) One scope for each controller The GLUE between the View and the Controller A hash of key/values Holds the data to display in the View $rootScope object – visible in all controllers Communication between scopes Dispatching event from parent scope to child scope $scope.$broadcast(‘event_name’, (optional) array of arguments to pass to event listeners); // where $scope is the parent scope Detecting events dispatched from parent scope in the child scope $scope.$on(‘event_name’, function(args) { // code to invoke if the event occurs }); // where $scope is the child scope Dispatching events from child scope to parent scope $scope.$emit(‘event_name’); // where $scope is the child scope Detecting events dispatched from child scope in the parent scope $scope.$on(‘event_name’); // where $scope is the parent scope What is Angular module? (1) Container for Controllers Services Directives Factories Filters Configuration information What is Angular module? (2) Each Angular JS app contains at least one module Discrete logical part of the application What is Angular directive? (1) Use them when you have to make DOM manipulations Ever wanted to create your own tag or attribute – this is how you do it! Takes you one step closer to creating domain-specific markup What is Angular directive? (2) Directives should not change a model or controller’s logic All they handle is creating the page’s content and structure of elements What is Angular filter? (1) Reusable operation using which you can modify the content that is shown on the page Examples: uppercase a value, filter search results, etc. Defining a new filter module.filter(“filter_name”, function(data) { // data is filtered or modified // in a specific manner and returned return data; } Using the filter we just defined <div data-ng-repeat= “record in records | filter: filter_name” > </div> Providers (1) 4 types Factory Service Value Provider Providers - Factory We define a function that returns an object to which we have attached methods and properties that will be accessible by factory users later This object is available everywhere in the module in which the factory was defined via Dependency Injection Factory example (1) – defining the factory module.factory(‘factory_id’, function() { return { functionname: function() { return “this is a function”; }, anotherfunction: function() { // make a request and get data from backend return data; } } }); Factory example (2) – using the factory Module.controller(‘ControllerName’, function ControllerName($scope, factory_id) { $scope.methodname = function() { factory_id.functionname(); } }); Providers - Service You define a function in which additional functions and properties are defined via the this keyword Service example (1) - defining a service module.service(‘service_name’, function() { this.function_name = function() { return “this is a function’s result”; }; this.anotherfunction = function() { // make a request to backend // and fetch data return data; }); Service example (2) - using a service in a controller Module.controller(‘ControllerName’, function ControllerName($scope, service_name) { $scope.methodname = function() { service_name.function_name(); } }); Providers - value Similar to constants Could be used to store configuration properties Value example (1) - defining a value module.value(‘value_name’, ‘value’); Value example (2) - using a value in a controller Module.controller(‘ControllerName’, function ControllerName($scope, value_name) { $scope.methodname = function() { if (value_name == ‘1’) { // do something based on // specific value of the constant } } }); Providers - provider Define $get method in a function that returns the object to be injected The object can have various properties and methods similar to the object returned by factory Provider example (1) - defining a provider module.provider(‘provider_name’, function() { this.$get = function() { return { function_name: function() { }, another_function: function() { } } }); Provider example (2) - Using a provider Module.controller(‘ControllerName’, function ControllerName($scope, provider_name) { $scope.methodname = function() { provider_name.function_name(); } }); Angular JS best practices Angular JS best practice #1 Create a separate for module for Services Controllers Filters Parts are more isolated and decoupled Easier to test a part of the application Angular JS best practice #2 Write some tests using Jasmine What is Angular module? Container for Services Directives Factories Filters Configuration information The ngApp directive <div data-ng-app=“”> </div> Angular animation = easy Introduced in latest build (05.04.2013) and introduced by Misko in YouTube video Uses CSS3 transitions Use the ngAnimate Angular directive for the element you wish to animate A word of warning You better avoid using Angular JS for IE6 and IE7 projects Because of lack of support for custom tags and hashchange events Stuff you did not see today (and you should definitely check out) A lot because Angular JS is HUGE Writing tests and executing test suite Form validation with Angular JS Internationalization with Angular JS (i18n) Localization with Angular JS (l10n) Some great resources (1) http://www.egghead.io/ - Angular JS video course by John Lindquist (@johnlindquist) http://www.yearofmoo.com/ - a blog that contains some great articles about Angular JS http://angularjs.org/ - Angular JS official website http://docs.angularjs.org/api/ - Angular JS API reference https://groups.google.com/group/angular/ Angular JS Google Group Some great resources (2) https://chrome.google.com/webstore/detail/ang ularjsbatarang/ighdmehidhipcmcojjgiloacoafjmpfk?hl =en - Angular JS Batarang, a great solution for debugging Angular JS applications https://www.youtube.com/watch?feature=player _embedded&v=q-7mhcHXSfM#! - A video demo of using Batarang Some great resources (3) https://github.com/angular/angular-seed A starting point for Angular JS projects Includes end to end tests folder where you could easily add some tests to your app using Jasmine http://docs.angularjs.org/guide/dev_guide.e2etesting A guide to testing Angular JS applications Questions? Thank you for your time Expect very soon: SharePoint Saturday! Saturday, June 8, 2013 Same familiar format – 1 day filled with sessions focused on SharePoint technologies Best SharePoint professionals in the region Registrations will be open next week (15th)! www.SharePointSaturday.eu Thanks to our Sponsors: Diamond Sponsor: Platinum Sponsors: Gold Sponsors: Swag Sponsors: Media Partners: