angularjs for java developers

45
AngularJS for Java Developers Loc Nguyen [email protected]

Upload: loc-nguyen

Post on 03-Jul-2015

598 views

Category:

Software


1 download

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

TRANSCRIPT

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