45
AngularJS for Java Developers Loc Nguyen [email protected]

AngularJS for Java Developers

Embed Size (px)

DESCRIPTION

An introduction to the AngularJS JavaScript MVC framework from Google. Tailored for Java developers. Presented at the Orange County Java Users Group on 10/09/2014

Citation preview

Page 1: AngularJS for Java Developers

AngularJS for Java

Developers

Loc [email protected]

Page 2: AngularJS for Java Developers

<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

Page 3: AngularJS for Java Developers

Agenda

● Thick client history

● Current state of JS

● MVC & Data binding

● Components

● Tooling

● Resources

Page 4: AngularJS for Java Developers

How to train your dragon JavaScript

Page 5: AngularJS for Java Developers

Ship It™

Page 6: AngularJS for Java Developers

Ambitious Web Applications™

Page 7: AngularJS for Java Developers
Page 8: AngularJS for Java Developers
Page 9: AngularJS for Java Developers
Page 10: AngularJS for Java Developers
Page 11: AngularJS for Java Developers

The Model

● Plain old Java(Script) objects – POJO!

● No need to extend a hierarchy

Page 12: AngularJS for Java Developers

class Member {

String name = "";

boolean active = true;

List<String> emails = new List<String>();

}

var member = {

name: '',

active: true,

emails: []

};

Page 13: AngularJS for Java Developers

The View

● Just plain HTML

● Built-in directives similar to JSTL

Page 14: AngularJS for Java Developers

// 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>

Page 15: AngularJS for Java Developers

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

Page 16: AngularJS for Java Developers

function meetupController($scope) {

$scope.person = {

name: 'Loc', active: true, emails: [...]

};

}

@Controller

class MeetupController {

public String index(Model model) {

Member person = new Member();

member.name = "Loc";

member.active = true;

member.emails = Arrays.asList(...);

model.setAttribute("scope", member);

}

}

package ocjug.controllers;

angular.module('ocjug.controllers', [])

.controller('MeetupController', meetupController);

Page 17: AngularJS for Java Developers

Data Binding

● $digest loop – Angular event loop

● $watch list – what’s dirty?

● http://codepen.io/anon/pen/EcoGd

Page 18: AngularJS for Java Developers

Dependency Injection

● Code to abstractions

● Testing is so easy

● SOLID

● Put controllers on a diet

Page 19: AngularJS for Java Developers

Services

● Promote cleaner code

● Organization and reusability

● Shared business logic

● Data retrieval

● One instance in app

● 3 ways to make a service!

Page 20: AngularJS for Java Developers

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

Page 21: AngularJS for Java Developers

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

}

});

Page 22: AngularJS for Java Developers

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() {

// ...

}

});

Page 23: AngularJS for Java Developers

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) {

// …

}

};

});

Page 24: AngularJS for Java Developers

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) ...

}

};

};

});

Page 25: AngularJS for Java Developers

Services (cont)

angular.module('ocjug', ['ocjug.services'])

.config(function(MeetupSearchProviderProvider) {

MeetupSearchProviderProvider.REMEMBER_SEARCHES = true;

});

Page 26: AngularJS for Java Developers

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

Page 27: AngularJS for Java Developers

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);

Page 28: AngularJS for Java Developers

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'">

Page 29: AngularJS for Java Developers

angular.module('ocjug.filters', [])

.filter('asCentimeters', function () {

return function (inches) {

return inches * 2.54;

};

});

{{2 | asCentimeters}} => 5.08

Page 30: AngularJS for Java Developers

Directives

● The killer feature of AngularJS

● ...and the most complex API

● Apply liberally

Page 31: AngularJS for Java Developers

Directives

● Built-in directives

○ ng-show, ng-click, ng-repeat

● Custom directives

○ reusable widgets

○ declarative programming

○ wrap non Angular libraries

Page 32: AngularJS for Java Developers

<div ng-repeat="picture in pictures">

<pic picture="picture"

commentable="{{picture.approved}}"></pic>

</div>

Page 33: AngularJS for Java Developers

// 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>

Page 34: AngularJS for Java Developers

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);

}

}

}

});

Page 35: AngularJS for Java Developers

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);

}

}

}

});

Page 36: AngularJS for Java Developers

Test and Tools

● Unit tests - Karma

● E2E - Protractor

● Node based build toolso Grunt

o Gulp

Page 37: AngularJS for Java Developers

What’s missing?

● SPA vs Islands of Richness

● Async and promises

● AJAX

● Performance

● Routing

● Testing

● Mobile

● Integration

Page 38: AngularJS for Java Developers

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

Page 39: AngularJS for Java Developers

docs.angularjs.org/tutorial

● Free!

● Beginner

Page 40: AngularJS for Java Developers

codeschool.com

● Free!

● Gamified learning

● Beginner

Page 41: AngularJS for Java Developers

egghead.io● AngularJS,

● JavaScript,

● D3.js

● EcmaScript 6

● NodeJS

● ReactJS

● $10m or $100/y

https://egghead.io/pricing?dc=ng_socal

Beginner – Advanced

Page 42: AngularJS for Java Developers

pluralsight.com

● $29 month

● The most Angular courses

● Deep coverage of JS

● ...and .NET

● Beginner – Advanced

Page 43: AngularJS for Java Developers

$23$40

Page 44: AngularJS for Java Developers
Page 45: AngularJS for Java Developers

angularjsoc.org

meetup.com/AngularJS-OC