SlideShare uma empresa Scribd logo
1 de 45
AngularJS for Java 
Developers 
Loc Nguyen 
lochnguyen@gmail.com
<ng-selfie/> 
● Organizer of AngularJS-OC [angularjsoc.org, @angularjsoc] 
● Multi-platform SW geek => Java, Ruby, JavaScript, C#, Node 
● First an Ember fan (still am) 
● ~1.5 years of AngularJS experience => mostly consulting
Agenda 
● Thick client history 
● Current state of JS 
● MVC & Data binding 
● Components 
● Tooling 
● Resources
How to train your dragon JavaScript
Ship It™
Ambitious Web Applications™
The Model 
● Plain old Java(Script) objects – POJO! 
● No need to extend a hierarchy
class Member { 
String name = ""; 
boolean active = true; 
List<String> emails = new List<String>(); 
} 
var member = { 
name: '', 
active: true, 
emails: [] 
};
The View 
● Just plain HTML 
● Built-in directives similar to JSTL
// index.jsp 
<c:if test="${member.active}"> 
<c:out value="${member.name}"/> 
<ul> 
<c:forEach items="${member.emails}" var="email"> 
<li><c:out value="${email}"/></li> 
</c:forEach> 
</ul> 
</c:if> 
// index.html 
<div ng-if="member.active"> 
{{member.name}} 
<ul> 
<li ng-repeat="email in member.emails"> 
{{email}} 
</li> 
</ul> 
</div>
The Controller 
● Plain old JavaScript functions 
● Instantiated as needed 
● Inject dependencies 
● Figure out what the view needs, defer retrieval 
● $scope is the context 
o a view model
package ocjug.controllers; 
@Controller 
class MeetupController { 
function meetupController($scope) { 
$scope.person = { 
name: 'Loc', active: true, emails: [...] 
}; 
} 
public String index(Model model) { 
Member person = new Member(); 
member.name = "Loc"; 
member.active = true; 
member.emails = Arrays.asList(...); 
model.setAttribute("scope", member); 
} 
} 
angular.module('ocjug.controllers', []) 
.controller('MeetupController', meetupController);
Data Binding 
● $digest loop – Angular event loop 
● $watch list – what’s dirty? 
● http://codepen.io/anon/pen/EcoGd
Dependency Injection 
● Code to abstractions 
● Testing is so easy 
● SOLID 
● Put controllers on a diet
Services 
● Promote cleaner code 
● Organization and reusability 
● Shared business logic 
● Data retrieval 
● One instance in app 
● 3 ways to make a service!
package ocjug.services; 
@Service 
class MeetupSearchService { 
private final API_KEY = "abc123"; 
private final SEARCH_URI = "https://api.meetup.com/search"; 
@Autowired 
SomeHttpClient httpClient; 
public List<SearchResult> search(Map params) { 
// start pseudo-ing 
httpClient.queryParams(params).get(SEARCH_URI); 
} 
} 
Example
angular.module('ocjug.services', []) 
.factory('MeetupSearchSvc', function ($http) { 
var API_KEY = 'abc123'; 
var SEARCH_URI = 'https://api.meetup.com/search'; 
var search = function (queryParams) { 
return $http.get(SEARCH_URI, { params: queryParams 
}); 
}; 
return { 
search: search 
} 
});
Services 
.service() - invoke with the new keyword 
angular.module('ocjug.services', []) 
.service('MeetupSearchService', function ($http) { 
this.API = 'http://api.meetup.com/search'; 
this.search = function() { 
// ... 
} 
});
Services (cont) 
.factory() - always use a factory! 
angular.module('ocjug.services', []) 
.factory('MeetupSearchService', function ($http) { 
var API = 'http://api.meetup.com/search'; 
return { 
search: function (params) { 
// … 
} 
}; 
});
Services (cont) 
.provider() - configure before app starts 
angular.module('ocjug.services', []) 
.provider('MeetupSearchProvider', function () { 
var API = 'http://api.meetup.com/search'; 
this.REMEMBER_SEARCHES = false; 
this.$get = function ($http) { 
return { 
search: function (params) { 
// … 
if (this.REMEMBER_SEARCHES) ... 
} 
}; 
}; 
});
Services (cont) 
angular.module('ocjug', ['ocjug.services']) 
.config(function(MeetupSearchProviderProvider) { 
MeetupSearchProviderProvider.REMEMBER_SEARCHES = true; 
});
angular.module('ocjug.controllers', []) 
.controller('MemberSearchCtrl', function ($scope, $http) { 
$http.get('http://api.meetup.com/search?name=' + 
$scope.name); 
}) 
.controller('MeetupSearchCtrl', function ($scope, $http) { 
$http.get('http://api.meetup.com/search?meetup=' 
+ $scope.meetup); 
}); 
Extracting into a Service
var ocjug = angular.module('ocjug', ['ocjug.services']); 
function memberSearchCtrl ($scope, MeetupSearchSvc) { 
MeetupSearchSvc.search({ name: $scope.name }); 
} 
ocjug.controller(MemberSearchCtrl, memberSearchCtrl); 
function meetupSearchCtrl ($scope, MeetupSearchSvc) { 
MeetupSearchSvc.search({ meetup: $scope.meetup }); 
} 
ocjug.controller(MeetupSearchCtrl, meetupSearchCtrl);
Filters 
● Take an input to filter 
● Easily format data in templates 
● Uses the | character in {{ }} expression 
{{1.456 | number:2}} => 1.46 
{{'ocjug'| uppercase | limitTo:3}} => OCJ 
{{99.99 | currency:'USD$' }} => USD$99.99 
<div ng-repeat="m in movies | orderBy:'revenue'">
angular.module('ocjug.filters', []) 
.filter('asCentimeters', function () { 
return function (inches) { 
return inches * 2.54; 
}; 
}); 
{{2 | asCentimeters}} => 5.08
Directives 
● The killer feature of AngularJS 
● ...and the most complex API 
● Apply liberally
Directives 
● Built-in directives 
○ ng-show, ng-click, ng-repeat 
● Custom directives 
○ reusable widgets 
○ declarative programming 
○ wrap non Angular libraries
<div ng-repeat="picture in pictures"> 
<pic picture="picture" 
commentable="{{picture.approved}}"></pic> 
</div>
// picture.tpl.html 
<div> 
<img ng-src="picture.url"/> 
<div>{{picture.caption}}</div> 
<a ng-click="fbLike(picture)">Like</a> 
<ul> 
<li ng-repeat="comment in picture.comments | 
limitTo:3"> 
{{comment}} 
</li> 
</ul> 
<comment-form picture="picture"> … </comment-form> 
</div>
angular.module(ocjug.directives, ['ocjug.services']) 
.directive('pic', function(FbService) { 
return { 
templateUrl: 'picture.tpl.html', 
scope: { 
picture: '=', 
commentable: '@' 
}, 
link: function ($scope, el, attrs) { 
$scope.fbLike = function(picture) { 
FbService.like(picture.id); 
} 
} 
} 
});
angular.module(ocjug.directives, ['ocjug.services]) 
.directive('commentForm', function(CommentService) { 
return { 
templateUrl: 'comment.tpl.html', 
scope: { 
picture: '=' 
}, 
link: function ($scope, el, attrs) { 
$scope.submit = function(comment) { 
CommentService.create(comment); 
} 
} 
} 
});
Test and Tools 
● Unit tests - Karma 
● E2E - Protractor 
● Node based build tools 
o Grunt 
o Gulp
What’s missing? 
● SPA vs Islands of Richness 
● Async and promises 
● AJAX 
● Performance 
● Routing 
● Testing 
● Mobile 
● Integration
Resources 
UI-Router: github.com/angular-ui/ui-router 
Angular-UI: github.com/angular-ui 
Ionic: ionicframework.com 
Year of Moo: yearofmoo.com 
Style Guide: github.com/johnpapa/angularjs-styleguide
docs.angularjs.org/tutorial 
● Free! 
● Beginner
codeschool.com 
● Free! 
● Gamified learning 
● Beginner
egghead.io 
● AngularJS, 
● JavaScript, 
● D3.js 
● EcmaScript 6 
● NodeJS 
● ReactJS 
● $10m or $100/y 
https://egghead.io/pricing?dc=ng_socal 
Beginner – Advanced
pluralsight.com 
● $29 month 
● The most Angular courses 
● Deep coverage of JS 
● ...and .NET 
● Beginner – Advanced
$40 $23
angularjsoc.org 
meetup.com/AngularJS-OC

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte II
 
Angularjs Basics
Angularjs BasicsAngularjs Basics
Angularjs Basics
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
Difference between java script and jquery
Difference between java script and jqueryDifference between java script and jquery
Difference between java script and jquery
 
Introduction to Angularjs
Introduction to AngularjsIntroduction to Angularjs
Introduction to Angularjs
 
Rethinking Best Practices
Rethinking Best PracticesRethinking Best Practices
Rethinking Best Practices
 
AngularJS Directives
AngularJS DirectivesAngularJS Directives
AngularJS Directives
 
Angular js routing options
Angular js routing optionsAngular js routing options
Angular js routing options
 
AngularJS Best Practices
AngularJS Best PracticesAngularJS Best Practices
AngularJS Best Practices
 
Angular Weekend
Angular WeekendAngular Weekend
Angular Weekend
 
React + Redux Introduction
React + Redux IntroductionReact + Redux Introduction
React + Redux Introduction
 
AngularJs
AngularJsAngularJs
AngularJs
 
Workshop 16: EmberJS Parte I
Workshop 16: EmberJS Parte IWorkshop 16: EmberJS Parte I
Workshop 16: EmberJS Parte I
 
The AngularJS way
The AngularJS wayThe AngularJS way
The AngularJS way
 
The Art of AngularJS - DeRailed 2014
The Art of AngularJS - DeRailed 2014The Art of AngularJS - DeRailed 2014
The Art of AngularJS - DeRailed 2014
 
AngularJS best-practices
AngularJS best-practicesAngularJS best-practices
AngularJS best-practices
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
React on es6+
React on es6+React on es6+
React on es6+
 
AngularJS Beginners Workshop
AngularJS Beginners WorkshopAngularJS Beginners Workshop
AngularJS Beginners Workshop
 
Overview of the AngularJS framework
Overview of the AngularJS framework Overview of the AngularJS framework
Overview of the AngularJS framework
 

Semelhante a AngularJS for Java Developers

Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and serverIntroducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
Spike Brehm
 

Semelhante a AngularJS for Java Developers (20)

Introduction of angular js
Introduction of angular jsIntroduction of angular js
Introduction of angular js
 
AngularJs Superheroic JavaScript MVW Framework Services by Miracle Studios
AngularJs Superheroic JavaScript MVW Framework Services by Miracle StudiosAngularJs Superheroic JavaScript MVW Framework Services by Miracle Studios
AngularJs Superheroic JavaScript MVW Framework Services by Miracle Studios
 
Mini-Training: AngularJS
Mini-Training: AngularJSMini-Training: AngularJS
Mini-Training: AngularJS
 
Webinar: AngularJS and the WordPress REST API
Webinar: AngularJS and the WordPress REST APIWebinar: AngularJS and the WordPress REST API
Webinar: AngularJS and the WordPress REST API
 
Webinar: AngularJS and the WordPress REST API
Webinar: AngularJS and the WordPress REST APIWebinar: AngularJS and the WordPress REST API
Webinar: AngularJS and the WordPress REST API
 
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
 
The Art of AngularJS in 2015 - Angular Summit 2015
The Art of AngularJS in 2015 - Angular Summit 2015The Art of AngularJS in 2015 - Angular Summit 2015
The Art of AngularJS in 2015 - Angular Summit 2015
 
Introduction to AngularJS For WordPress Developers
Introduction to AngularJS For WordPress DevelopersIntroduction to AngularJS For WordPress Developers
Introduction to AngularJS For WordPress Developers
 
AngularJs-training
AngularJs-trainingAngularJs-training
AngularJs-training
 
AngularJS and SPA
AngularJS and SPAAngularJS and SPA
AngularJS and SPA
 
Basics of AngularJS
Basics of AngularJSBasics of AngularJS
Basics of AngularJS
 
Get AngularJS Started!
Get AngularJS Started!Get AngularJS Started!
Get AngularJS Started!
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and serverIntroducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
Dive into AngularJS and directives
Dive into AngularJS and directivesDive into AngularJS and directives
Dive into AngularJS and directives
 
Angular js
Angular jsAngular js
Angular js
 
Coffee@DBG - Exploring Angular JS
Coffee@DBG - Exploring Angular JSCoffee@DBG - Exploring Angular JS
Coffee@DBG - Exploring Angular JS
 
Angularjs
AngularjsAngularjs
Angularjs
 
Introduction to angular js
Introduction to angular jsIntroduction to angular js
Introduction to angular js
 
AngularJS Mobile Warsaw 20-10-2014
AngularJS Mobile Warsaw 20-10-2014AngularJS Mobile Warsaw 20-10-2014
AngularJS Mobile Warsaw 20-10-2014
 

Último

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 

Último (20)

W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 

AngularJS for Java Developers

  • 1. AngularJS for Java Developers Loc Nguyen lochnguyen@gmail.com
  • 2. <ng-selfie/> ● Organizer of AngularJS-OC [angularjsoc.org, @angularjsoc] ● Multi-platform SW geek => Java, Ruby, JavaScript, C#, Node ● First an Ember fan (still am) ● ~1.5 years of AngularJS experience => mostly consulting
  • 3. Agenda ● Thick client history ● Current state of JS ● MVC & Data binding ● Components ● Tooling ● Resources
  • 4. How to train your dragon JavaScript
  • 7.
  • 8.
  • 9.
  • 10.
  • 11. The Model ● Plain old Java(Script) objects – POJO! ● No need to extend a hierarchy
  • 12. class Member { String name = ""; boolean active = true; List<String> emails = new List<String>(); } var member = { name: '', active: true, emails: [] };
  • 13. The View ● Just plain HTML ● Built-in directives similar to JSTL
  • 14. // index.jsp <c:if test="${member.active}"> <c:out value="${member.name}"/> <ul> <c:forEach items="${member.emails}" var="email"> <li><c:out value="${email}"/></li> </c:forEach> </ul> </c:if> // index.html <div ng-if="member.active"> {{member.name}} <ul> <li ng-repeat="email in member.emails"> {{email}} </li> </ul> </div>
  • 15. The Controller ● Plain old JavaScript functions ● Instantiated as needed ● Inject dependencies ● Figure out what the view needs, defer retrieval ● $scope is the context o a view model
  • 16. package ocjug.controllers; @Controller class MeetupController { function meetupController($scope) { $scope.person = { name: 'Loc', active: true, emails: [...] }; } public String index(Model model) { Member person = new Member(); member.name = "Loc"; member.active = true; member.emails = Arrays.asList(...); model.setAttribute("scope", member); } } angular.module('ocjug.controllers', []) .controller('MeetupController', meetupController);
  • 17. Data Binding ● $digest loop – Angular event loop ● $watch list – what’s dirty? ● http://codepen.io/anon/pen/EcoGd
  • 18. Dependency Injection ● Code to abstractions ● Testing is so easy ● SOLID ● Put controllers on a diet
  • 19. Services ● Promote cleaner code ● Organization and reusability ● Shared business logic ● Data retrieval ● One instance in app ● 3 ways to make a service!
  • 20. package ocjug.services; @Service class MeetupSearchService { private final API_KEY = "abc123"; private final SEARCH_URI = "https://api.meetup.com/search"; @Autowired SomeHttpClient httpClient; public List<SearchResult> search(Map params) { // start pseudo-ing httpClient.queryParams(params).get(SEARCH_URI); } } Example
  • 21. angular.module('ocjug.services', []) .factory('MeetupSearchSvc', function ($http) { var API_KEY = 'abc123'; var SEARCH_URI = 'https://api.meetup.com/search'; var search = function (queryParams) { return $http.get(SEARCH_URI, { params: queryParams }); }; return { search: search } });
  • 22. Services .service() - invoke with the new keyword angular.module('ocjug.services', []) .service('MeetupSearchService', function ($http) { this.API = 'http://api.meetup.com/search'; this.search = function() { // ... } });
  • 23. Services (cont) .factory() - always use a factory! angular.module('ocjug.services', []) .factory('MeetupSearchService', function ($http) { var API = 'http://api.meetup.com/search'; return { search: function (params) { // … } }; });
  • 24. Services (cont) .provider() - configure before app starts angular.module('ocjug.services', []) .provider('MeetupSearchProvider', function () { var API = 'http://api.meetup.com/search'; this.REMEMBER_SEARCHES = false; this.$get = function ($http) { return { search: function (params) { // … if (this.REMEMBER_SEARCHES) ... } }; }; });
  • 25. Services (cont) angular.module('ocjug', ['ocjug.services']) .config(function(MeetupSearchProviderProvider) { MeetupSearchProviderProvider.REMEMBER_SEARCHES = true; });
  • 26. angular.module('ocjug.controllers', []) .controller('MemberSearchCtrl', function ($scope, $http) { $http.get('http://api.meetup.com/search?name=' + $scope.name); }) .controller('MeetupSearchCtrl', function ($scope, $http) { $http.get('http://api.meetup.com/search?meetup=' + $scope.meetup); }); Extracting into a Service
  • 27. var ocjug = angular.module('ocjug', ['ocjug.services']); function memberSearchCtrl ($scope, MeetupSearchSvc) { MeetupSearchSvc.search({ name: $scope.name }); } ocjug.controller(MemberSearchCtrl, memberSearchCtrl); function meetupSearchCtrl ($scope, MeetupSearchSvc) { MeetupSearchSvc.search({ meetup: $scope.meetup }); } ocjug.controller(MeetupSearchCtrl, meetupSearchCtrl);
  • 28. Filters ● Take an input to filter ● Easily format data in templates ● Uses the | character in {{ }} expression {{1.456 | number:2}} => 1.46 {{'ocjug'| uppercase | limitTo:3}} => OCJ {{99.99 | currency:'USD$' }} => USD$99.99 <div ng-repeat="m in movies | orderBy:'revenue'">
  • 29. angular.module('ocjug.filters', []) .filter('asCentimeters', function () { return function (inches) { return inches * 2.54; }; }); {{2 | asCentimeters}} => 5.08
  • 30. Directives ● The killer feature of AngularJS ● ...and the most complex API ● Apply liberally
  • 31. Directives ● Built-in directives ○ ng-show, ng-click, ng-repeat ● Custom directives ○ reusable widgets ○ declarative programming ○ wrap non Angular libraries
  • 32. <div ng-repeat="picture in pictures"> <pic picture="picture" commentable="{{picture.approved}}"></pic> </div>
  • 33. // picture.tpl.html <div> <img ng-src="picture.url"/> <div>{{picture.caption}}</div> <a ng-click="fbLike(picture)">Like</a> <ul> <li ng-repeat="comment in picture.comments | limitTo:3"> {{comment}} </li> </ul> <comment-form picture="picture"> … </comment-form> </div>
  • 34. angular.module(ocjug.directives, ['ocjug.services']) .directive('pic', function(FbService) { return { templateUrl: 'picture.tpl.html', scope: { picture: '=', commentable: '@' }, link: function ($scope, el, attrs) { $scope.fbLike = function(picture) { FbService.like(picture.id); } } } });
  • 35. angular.module(ocjug.directives, ['ocjug.services]) .directive('commentForm', function(CommentService) { return { templateUrl: 'comment.tpl.html', scope: { picture: '=' }, link: function ($scope, el, attrs) { $scope.submit = function(comment) { CommentService.create(comment); } } } });
  • 36. Test and Tools ● Unit tests - Karma ● E2E - Protractor ● Node based build tools o Grunt o Gulp
  • 37. What’s missing? ● SPA vs Islands of Richness ● Async and promises ● AJAX ● Performance ● Routing ● Testing ● Mobile ● Integration
  • 38. Resources UI-Router: github.com/angular-ui/ui-router Angular-UI: github.com/angular-ui Ionic: ionicframework.com Year of Moo: yearofmoo.com Style Guide: github.com/johnpapa/angularjs-styleguide
  • 40. codeschool.com ● Free! ● Gamified learning ● Beginner
  • 41. egghead.io ● AngularJS, ● JavaScript, ● D3.js ● EcmaScript 6 ● NodeJS ● ReactJS ● $10m or $100/y https://egghead.io/pricing?dc=ng_socal Beginner – Advanced
  • 42. pluralsight.com ● $29 month ● The most Angular courses ● Deep coverage of JS ● ...and .NET ● Beginner – Advanced
  • 44.

Notas do Editor

  1. No API to learn for models! POJOS
  2. Use familiar markup