SlideShare una empresa de Scribd logo
1 de 36
Descargar para leer sin conexión
Angular.JS
Advanced Angular.JS - GDayX VN 2013
About me
Nicolas Embleton, French in Ho Chi Minh City

•

2005 - Software Engineer and System Architect, working on legacy tech stacks
(C++, OpenGL, Java, ...) then quickly Web (PHP)

•
•
•

2009 - Founded a Mobile Development Company of 30 individuals
2011 - Started Datafield Startup, Co-founder, CTO
2013 - Started the Javascript Ho Chi Minh City meetup, Getting active in Startup
Vietnamese scene to support and mentor young talents
Agenda

•
•
•
•
•
•
•
•

Quick Intro
Bootstrapping
Why Angular?
Main features, and why it's awesome
Best practices
Testing, tooling
And SEO?
Final words
Intro (quick)
From Wikipedia:

AngularJS is built around the belief that declarative programming should be used for building UIs and
wiring software components, while imperative programming is excellent for expressing business
logic. The framework adapts and extends traditional HTML to better serve dynamic content through two-way databinding that allows for the automatic synchronization of models and views. As a result, AngularJS deemphasizes DOM
manipulation and improves testability.
Angular JS quick review

•
•
•
•
•
•
•

Templating
Model View Controller (MVC)
Extends HTML (very flexible)
2-ways Data-binding
Very reusable (if you follow best practices)
Improves testability (because it is reusable)
Provides routing, history, jqLite, ...
Bootstrapping

•

Using angular-seeds
o git clone https://github.com/angular/angular-seed.git
o node scripts/web-server.js
o open http://localhost:8000/app/index.html

•

Using yeoman (excellent workflow tool)
o
o
o
o
o

(sudo) npm install -g yo
(sudo) npm install -g generator-angular
yo angular
bower install angular-ui
grunt server
Now, the meat, the main features

•
•
•
•
•
•

Templating
Routing
2-ways data-binding
Directives, services
Dependency Injection
Inter-components Communication
Templating

•

Models
o
o

•

2-way binding
Easy property mapping

Built-in directives
o

ngView
Where the routing happens

o

ngRepeat
Iterator

o
o

ngIf
ngSwitch
Templating - Conditional with ngIf
<div ng-repeat="message in data.messages" ng-class="message.type">
<hr>
<div ng-if="showFrom(message)">
<div>From: {{message.from.name}}</div>
</div>
<div ng-if="showCreatedBy(message)">
<div>Created by: {{message.createdBy.name}}</div>
</div>
<div ng-if="showTo(message)">
<div>To: {{message.to.name}}</div>
</div>
</div>
Templating - Nested repeat
<div ng-repeat="group in groups"><!-- 1st ng-repeat level -->
<h2>{{ group.label }}</h2>
<ul>
<li ng-repeat="friend in group.friends">
<!-- 2nd ng-repeat level -->
{{ friend.name }}
</li>
</ul><!-- END: Inner ngRepeat. -->
</div><!-- END: Outer ngRepeat. -->
Templating - Example 2 - Switch
<div ng-switch on="selection" >
<div ng-switch-when="settings">Settings Div</div>
<span ng-switch-when="home">Home Span</span>
<span ng-switch-default>default</span>
</div>
Example 2.2 - Switch with 2-way bind
<div ng-controller="Ctrl">
<select ng-model="selection" ng-options="item for item in items">
</select>
<tt>selection={{selection}}</tt>
<hr/>
<div class="animate-switch-container"
ng-switch on="selection">
<div ng-switch-when="settings">Settings Div</div>
<div ng-switch-when="home">Home Span</div>
<div ng-switch-default>default</div>
</div>
</div>
Templating - Simple ngRepeat
<li ng-repeat="item in items">
Item: {{ item }}
</li>
Templating - Complex ngRepeat
<header ng-repeat-start="item in items">
Header {{ item }}
</header>
<div class="body">
Body {{ item }}
</div>
<footer ng-repeat-end>
Footer {{ item }}
</footer>
Compiling
// compile the new DOM and link it to the current scope.
// NOTE: we only compile .childNodes so that
// we don't get into infinite loop compiling ourselves
$compile(element.contents())(scope);
Templating - Routing

•
•
•
•

Happens in ngView
Routing is a very powerful feature
Allows to update "pieces" of the page
Can stream files from disk to make it truly isolated
2-ways data-binding
•
•
•
•

Becoming more standard, thanks to frameworks like Ember.js or Angular.js

•

Example

Linking 2 fields for synchronization purpose
Linking data to model
Automatically updating the template as data is changed
o Arrays / Collections
o Inputs
o etc…
2-ways data-binding, example
<input type="text" ng-model="title" style="width: 90%"/>
<div ng-app="myapp">
<div ng-controller="mycontroller">
Title: {{ title }} <!-- 2-way data binding -->
<hr>
<div class="zippy" zippy-title="title"></div>
</div>
</div>
Directives

•
•
•

Angular.js killer feature
Great deal of re-usability
Just look for directives at ngmodules.org
Restricting Directives

•
•
•
•
•

"E": Element, <my-directive>
"A": Attribute, <div my-directive>
"C": Class, <div class="my-directive">
"M": Comment: <!-- directive: my-directive exp -->
Combine (e.g. "EA") for more flexibility
Communicating between directives

•
•

Many design patterns
The "backbonier"
o

•

the emitter and the receiver

A more connected example
o

the directive combinations and controller sharing
Communicating between directives
app.directive('directiveA', function($rootScope){
return function(scope, element, attrs) {

// $rootScope = App Scope
// scope = Current scope (ctrl)

$rootScope.$on('someEvent', function(){
// From here we can react anytime there's an event "someEvent" triggered
});
};
});
Communicating between directives
app.directive('gdayx', function() {

// Creating the directive

return {
restrict: 'E',

// Restricted to "element"

controller: function($scope) {
$scope.what = "";
this.is = function(what) {

// Creating the controller of the directive
// Local data

// External accessor

$scope.what = what;
}
},
link: function($scope, $element){
$element.bind("click", function() { // Binding on click
alert("GDayX is "+$scope.what); // Getting content from the Controller.
});
}
}
});
Communicating between directives
// This directive will "send" data to the first directive
app.directive('is', function() {

// Creating the directive

return {
require: "gdayx",

// Requiring the "gdayx" controller

restrict: 'A',

// Restricting to "attribute"

link: function(scope, element, attrs, gdayxCtrl) {
// gdayxCtrl from the "require: 'gdayx'"
gdayxCtrl.is(attrs.is); // Passing value to the "gdayx" controller
}
}
});
AngularJS - Why is it awesome?

•
•
•
•
•

Mature, production-ready
Feature-rich
The design and what it allows
Strong support from giants like Google
A lot of solid companies are embracing it
o
o
o

Ebay Commerce Network
DoubleClick (Google) - Marketing Manager & Planner
YouTube APP on PS3
Best Practices

•
•

Organize the code well (Captain Obvious!)
Organize modules by feature
angular.module('users', ['utilities']);
angular.module('groups', ['utilities']);
angular.module('mainApp', ['users', 'groups']);

•
•

Use the reusability as much as possible
Use the testability as much as possible
o
o

TDD
BDD?
Testing, tooling
•
•
•
•
•
•

Yeoman
o Super workflow tool and generator/scaffolder
Batarang
o Chrome Debugger Extension, (A must have), link
Grunt
o Task runner
Bower
o Package Manager for JS Libraries
Protractor, Karma
o Test Runner
Jasmine, Mocha
o Test Frameworks
And SEO?

•

Google "Snapshot" famous technic
o
o
o

•
•

_escaped_fragment_
Turns this:
http://prerender.io/getting-started#html5-pushstate
Into this:
http://prerender.io/getting-started?_escaped_fragment_=html5pushstate

prerender.io/ - Open Source project
brombone.com/ - Commercial project
Enterprise project with Angular?

•
•

YES
BUT
Enterprise project with Angular?

•
•

YES
BUT
o
o
o

Follow best practices (easier said than done)
System Architecture is KEY to a solid system
As "Agile" would advise, always try to go for simpler but "well-thought"
"team-friendly"designs.
Enterprise project with Angular?

•

An example Architecture
Legacy Front End

Backend
(legacy)

Experimental Front
End

DB
Backend
(experimental)

Server-side team realm

Experimental Front
End 2

Front-End team realm
Final Words

•
•

Angular 1.0.x is mature
Angular 1.2+ will bring more awesomeness
o
o

Better and Fluid Animations (js/css3)
More flexibility and functionalities
$interval: add a service wrapping setInterval
Event directives: add ngCopy, ngCut, and ngPaste
jQuery 1.10.x support
DEMO
(if time permits :)
Bootstrapped app

•
•

Let's see a quick Angular App
Bootstrapped from Yeoman
Where you can find me:
Author: Nicolas Embleton @: nicolas.embleton@gmail.com
Presentation made for “Google Developer Day GDayX 2013 Vietnam”
You can follow me at:
https://plus.google.com/+NicolasEmbleton
https://twitter.com/nicolasembleton

•
•

And the Javascript Ho Chi Minh City Meetup:
http://meetup.com/JavaScript-Ho-Chi-Minh-City/
https://www.facebook.com/JavaScriptHCMC
https://plus.google.com/communities/116105314977285194967

•
•
•

o

Our group is looking for Projects to mentor. If you have a project you want support for, contact me
Resources
Learning

•
•
•

Learning AngularJS by the example (+60 minutes-ish training video)

•
•

http://docs.angularjs.org/guide/dev_guide.templates.databinding

http://www.nganimate.org/
https://github.com/angular-ui/ui-router
o It's a full "nested-view" library
ng-learn.org

Reusable Components

•
•

http://ngmodules.org/
http://www.directiv.es/

Más contenido relacionado

La actualidad más candente

JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your code
Laurence Svekis ✔
 
High Performance Django
High Performance DjangoHigh Performance Django
High Performance Django
DjangoCon2008
 

La actualidad más candente (20)

Bootstrap과 UI-Bootstrap
Bootstrap과 UI-BootstrapBootstrap과 UI-Bootstrap
Bootstrap과 UI-Bootstrap
 
Vue routing tutorial getting started with vue router
Vue routing tutorial getting started with vue routerVue routing tutorial getting started with vue router
Vue routing tutorial getting started with vue router
 
Vue business first
Vue business firstVue business first
Vue business first
 
Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...
Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...
Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become ...
 
Top 45 jQuery Interview Questions and Answers | Edureka
Top 45 jQuery Interview Questions and Answers | EdurekaTop 45 jQuery Interview Questions and Answers | Edureka
Top 45 jQuery Interview Questions and Answers | Edureka
 
The Role of Python in SPAs (Single-Page Applications)
The Role of Python in SPAs (Single-Page Applications)The Role of Python in SPAs (Single-Page Applications)
The Role of Python in SPAs (Single-Page Applications)
 
Reactive Type-safe WebComponents
Reactive Type-safe WebComponentsReactive Type-safe WebComponents
Reactive Type-safe WebComponents
 
Building and deploying React applications
Building and deploying React applicationsBuilding and deploying React applications
Building and deploying React applications
 
Gae
GaeGae
Gae
 
Building a Startup Stack with AngularJS
Building a Startup Stack with AngularJSBuilding a Startup Stack with AngularJS
Building a Startup Stack with AngularJS
 
JavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your codeJavaScript Advanced - Useful methods to power up your code
JavaScript Advanced - Useful methods to power up your code
 
How to Webpack your Django!
How to Webpack your Django!How to Webpack your Django!
How to Webpack your Django!
 
An introduction to Vue.js
An introduction to Vue.jsAn introduction to Vue.js
An introduction to Vue.js
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQuery
 
An Introduction to Vuejs
An Introduction to VuejsAn Introduction to Vuejs
An Introduction to Vuejs
 
High Performance Django
High Performance DjangoHigh Performance Django
High Performance Django
 
Django for mobile applications
Django for mobile applicationsDjango for mobile applications
Django for mobile applications
 
HTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymoreHTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymore
 
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJRealize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
 
WordPress-Templates mit Twig erstellen - PHPUGFFM
WordPress-Templates mit Twig erstellen - PHPUGFFMWordPress-Templates mit Twig erstellen - PHPUGFFM
WordPress-Templates mit Twig erstellen - PHPUGFFM
 

Similar a gDayX 2013 - Advanced AngularJS - Nicolas Embleton

GDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App EngineGDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App Engine
Yared Ayalew
 

Similar a gDayX 2013 - Advanced AngularJS - Nicolas Embleton (20)

Nicolas Embleton, Advanced Angular JS
Nicolas Embleton, Advanced Angular JSNicolas Embleton, Advanced Angular JS
Nicolas Embleton, Advanced Angular JS
 
GDayX - Advanced Angular.JS
GDayX - Advanced Angular.JSGDayX - Advanced Angular.JS
GDayX - Advanced Angular.JS
 
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJSAngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
AngularJS training - Day 1 - Basics: Why, What and basic features of AngularJS
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJS
 
Angular - Beginner
Angular - BeginnerAngular - Beginner
Angular - Beginner
 
ZZ BC#7.5 asp.net mvc practice and guideline refresh!
ZZ BC#7.5 asp.net mvc practice  and guideline refresh! ZZ BC#7.5 asp.net mvc practice  and guideline refresh!
ZZ BC#7.5 asp.net mvc practice and guideline refresh!
 
Mini-Training: AngularJS
Mini-Training: AngularJSMini-Training: AngularJS
Mini-Training: AngularJS
 
From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Again
 
AngularJS 101 - Everything you need to know to get started
AngularJS 101 - Everything you need to know to get startedAngularJS 101 - Everything you need to know to get started
AngularJS 101 - Everything you need to know to get started
 
Yeoman AngularJS and D3 - A solid stack for web apps
Yeoman AngularJS and D3 - A solid stack for web appsYeoman AngularJS and D3 - A solid stack for web apps
Yeoman AngularJS and D3 - A solid stack for web apps
 
Basics of AngularJS
Basics of AngularJSBasics of AngularJS
Basics of AngularJS
 
AngularJS Workshop
AngularJS WorkshopAngularJS Workshop
AngularJS Workshop
 
Tech Talk: DevOps at LeanIX @ Startup Camp Berlin
Tech Talk: DevOps at LeanIX @ Startup Camp BerlinTech Talk: DevOps at LeanIX @ Startup Camp Berlin
Tech Talk: DevOps at LeanIX @ Startup Camp Berlin
 
Intro to AngularJs
Intro to AngularJsIntro to AngularJs
Intro to AngularJs
 
Angular or Backbone: Go Mobile!
Angular or Backbone: Go Mobile!Angular or Backbone: Go Mobile!
Angular or Backbone: Go Mobile!
 
Knolx session
Knolx sessionKnolx session
Knolx session
 
GDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App EngineGDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App Engine
 
ME vs WEB - AngularJS Fundamentals
ME vs WEB - AngularJS FundamentalsME vs WEB - AngularJS Fundamentals
ME vs WEB - AngularJS Fundamentals
 
Intro To Django
Intro To DjangoIntro To Django
Intro To Django
 
Angular Js Basics
Angular Js BasicsAngular Js Basics
Angular Js Basics
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 

gDayX 2013 - Advanced AngularJS - Nicolas Embleton

  • 2. About me Nicolas Embleton, French in Ho Chi Minh City • 2005 - Software Engineer and System Architect, working on legacy tech stacks (C++, OpenGL, Java, ...) then quickly Web (PHP) • • • 2009 - Founded a Mobile Development Company of 30 individuals 2011 - Started Datafield Startup, Co-founder, CTO 2013 - Started the Javascript Ho Chi Minh City meetup, Getting active in Startup Vietnamese scene to support and mentor young talents
  • 3. Agenda • • • • • • • • Quick Intro Bootstrapping Why Angular? Main features, and why it's awesome Best practices Testing, tooling And SEO? Final words
  • 4. Intro (quick) From Wikipedia: AngularJS is built around the belief that declarative programming should be used for building UIs and wiring software components, while imperative programming is excellent for expressing business logic. The framework adapts and extends traditional HTML to better serve dynamic content through two-way databinding that allows for the automatic synchronization of models and views. As a result, AngularJS deemphasizes DOM manipulation and improves testability.
  • 5. Angular JS quick review • • • • • • • Templating Model View Controller (MVC) Extends HTML (very flexible) 2-ways Data-binding Very reusable (if you follow best practices) Improves testability (because it is reusable) Provides routing, history, jqLite, ...
  • 6. Bootstrapping • Using angular-seeds o git clone https://github.com/angular/angular-seed.git o node scripts/web-server.js o open http://localhost:8000/app/index.html • Using yeoman (excellent workflow tool) o o o o o (sudo) npm install -g yo (sudo) npm install -g generator-angular yo angular bower install angular-ui grunt server
  • 7. Now, the meat, the main features • • • • • • Templating Routing 2-ways data-binding Directives, services Dependency Injection Inter-components Communication
  • 8. Templating • Models o o • 2-way binding Easy property mapping Built-in directives o ngView Where the routing happens o ngRepeat Iterator o o ngIf ngSwitch
  • 9. Templating - Conditional with ngIf <div ng-repeat="message in data.messages" ng-class="message.type"> <hr> <div ng-if="showFrom(message)"> <div>From: {{message.from.name}}</div> </div> <div ng-if="showCreatedBy(message)"> <div>Created by: {{message.createdBy.name}}</div> </div> <div ng-if="showTo(message)"> <div>To: {{message.to.name}}</div> </div> </div>
  • 10. Templating - Nested repeat <div ng-repeat="group in groups"><!-- 1st ng-repeat level --> <h2>{{ group.label }}</h2> <ul> <li ng-repeat="friend in group.friends"> <!-- 2nd ng-repeat level --> {{ friend.name }} </li> </ul><!-- END: Inner ngRepeat. --> </div><!-- END: Outer ngRepeat. -->
  • 11. Templating - Example 2 - Switch <div ng-switch on="selection" > <div ng-switch-when="settings">Settings Div</div> <span ng-switch-when="home">Home Span</span> <span ng-switch-default>default</span> </div>
  • 12. Example 2.2 - Switch with 2-way bind <div ng-controller="Ctrl"> <select ng-model="selection" ng-options="item for item in items"> </select> <tt>selection={{selection}}</tt> <hr/> <div class="animate-switch-container" ng-switch on="selection"> <div ng-switch-when="settings">Settings Div</div> <div ng-switch-when="home">Home Span</div> <div ng-switch-default>default</div> </div> </div>
  • 13. Templating - Simple ngRepeat <li ng-repeat="item in items"> Item: {{ item }} </li>
  • 14. Templating - Complex ngRepeat <header ng-repeat-start="item in items"> Header {{ item }} </header> <div class="body"> Body {{ item }} </div> <footer ng-repeat-end> Footer {{ item }} </footer>
  • 15. Compiling // compile the new DOM and link it to the current scope. // NOTE: we only compile .childNodes so that // we don't get into infinite loop compiling ourselves $compile(element.contents())(scope);
  • 16. Templating - Routing • • • • Happens in ngView Routing is a very powerful feature Allows to update "pieces" of the page Can stream files from disk to make it truly isolated
  • 17. 2-ways data-binding • • • • Becoming more standard, thanks to frameworks like Ember.js or Angular.js • Example Linking 2 fields for synchronization purpose Linking data to model Automatically updating the template as data is changed o Arrays / Collections o Inputs o etc…
  • 18. 2-ways data-binding, example <input type="text" ng-model="title" style="width: 90%"/> <div ng-app="myapp"> <div ng-controller="mycontroller"> Title: {{ title }} <!-- 2-way data binding --> <hr> <div class="zippy" zippy-title="title"></div> </div> </div>
  • 19. Directives • • • Angular.js killer feature Great deal of re-usability Just look for directives at ngmodules.org
  • 20. Restricting Directives • • • • • "E": Element, <my-directive> "A": Attribute, <div my-directive> "C": Class, <div class="my-directive"> "M": Comment: <!-- directive: my-directive exp --> Combine (e.g. "EA") for more flexibility
  • 21. Communicating between directives • • Many design patterns The "backbonier" o • the emitter and the receiver A more connected example o the directive combinations and controller sharing
  • 22. Communicating between directives app.directive('directiveA', function($rootScope){ return function(scope, element, attrs) { // $rootScope = App Scope // scope = Current scope (ctrl) $rootScope.$on('someEvent', function(){ // From here we can react anytime there's an event "someEvent" triggered }); }; });
  • 23. Communicating between directives app.directive('gdayx', function() { // Creating the directive return { restrict: 'E', // Restricted to "element" controller: function($scope) { $scope.what = ""; this.is = function(what) { // Creating the controller of the directive // Local data // External accessor $scope.what = what; } }, link: function($scope, $element){ $element.bind("click", function() { // Binding on click alert("GDayX is "+$scope.what); // Getting content from the Controller. }); } } });
  • 24. Communicating between directives // This directive will "send" data to the first directive app.directive('is', function() { // Creating the directive return { require: "gdayx", // Requiring the "gdayx" controller restrict: 'A', // Restricting to "attribute" link: function(scope, element, attrs, gdayxCtrl) { // gdayxCtrl from the "require: 'gdayx'" gdayxCtrl.is(attrs.is); // Passing value to the "gdayx" controller } } });
  • 25. AngularJS - Why is it awesome? • • • • • Mature, production-ready Feature-rich The design and what it allows Strong support from giants like Google A lot of solid companies are embracing it o o o Ebay Commerce Network DoubleClick (Google) - Marketing Manager & Planner YouTube APP on PS3
  • 26. Best Practices • • Organize the code well (Captain Obvious!) Organize modules by feature angular.module('users', ['utilities']); angular.module('groups', ['utilities']); angular.module('mainApp', ['users', 'groups']); • • Use the reusability as much as possible Use the testability as much as possible o o TDD BDD?
  • 27. Testing, tooling • • • • • • Yeoman o Super workflow tool and generator/scaffolder Batarang o Chrome Debugger Extension, (A must have), link Grunt o Task runner Bower o Package Manager for JS Libraries Protractor, Karma o Test Runner Jasmine, Mocha o Test Frameworks
  • 28. And SEO? • Google "Snapshot" famous technic o o o • • _escaped_fragment_ Turns this: http://prerender.io/getting-started#html5-pushstate Into this: http://prerender.io/getting-started?_escaped_fragment_=html5pushstate prerender.io/ - Open Source project brombone.com/ - Commercial project
  • 29. Enterprise project with Angular? • • YES BUT
  • 30. Enterprise project with Angular? • • YES BUT o o o Follow best practices (easier said than done) System Architecture is KEY to a solid system As "Agile" would advise, always try to go for simpler but "well-thought" "team-friendly"designs.
  • 31. Enterprise project with Angular? • An example Architecture Legacy Front End Backend (legacy) Experimental Front End DB Backend (experimental) Server-side team realm Experimental Front End 2 Front-End team realm
  • 32. Final Words • • Angular 1.0.x is mature Angular 1.2+ will bring more awesomeness o o Better and Fluid Animations (js/css3) More flexibility and functionalities $interval: add a service wrapping setInterval Event directives: add ngCopy, ngCut, and ngPaste jQuery 1.10.x support
  • 34. Bootstrapped app • • Let's see a quick Angular App Bootstrapped from Yeoman
  • 35. Where you can find me: Author: Nicolas Embleton @: nicolas.embleton@gmail.com Presentation made for “Google Developer Day GDayX 2013 Vietnam” You can follow me at: https://plus.google.com/+NicolasEmbleton https://twitter.com/nicolasembleton • • And the Javascript Ho Chi Minh City Meetup: http://meetup.com/JavaScript-Ho-Chi-Minh-City/ https://www.facebook.com/JavaScriptHCMC https://plus.google.com/communities/116105314977285194967 • • • o Our group is looking for Projects to mentor. If you have a project you want support for, contact me
  • 36. Resources Learning • • • Learning AngularJS by the example (+60 minutes-ish training video) • • http://docs.angularjs.org/guide/dev_guide.templates.databinding http://www.nganimate.org/ https://github.com/angular-ui/ui-router o It's a full "nested-view" library ng-learn.org Reusable Components • • http://ngmodules.org/ http://www.directiv.es/