SlideShare a Scribd company logo
Ember.js and AngularJS
Two Architectures Compared

Evan Dorn
and Hannah Howard
Logical Reality Design
http://lrdesign.com
evan@lrdesign.com
@idahoev
hannah@techgirlwonder.com
@techgirlwonder

Tuesday, November 19, 13
How do I web application?

Tuesday, November 19, 13
Simple apps can use
simple tools.

Tuesday, November 19, 13
BIG APPS NEED

ARCHITECTURE

Tuesday, November 19, 13
BIG APPS NEED

ARCHITECTURE
•Keep

Tuesday, November 19, 13

it organized!
BIG APPS NEED

ARCHITECTURE
•Keep

it organized!

•Modularize

Tuesday, November 19, 13

your code!
BIG APPS NEED

ARCHITECTURE
•Keep

it organized!

•Modularize
•Separate

Tuesday, November 19, 13

your code!

concerns!
BIG APPS NEED

ARCHITECTURE
•Keep

it organized!

•Modularize

your code!

•Separate

concerns!

•Establish

conventions for smooth teamwork!

Tuesday, November 19, 13
BIG APPS NEED

ARCHITECTURE
•Keep

it organized!

•Modularize

your code!

•Separate

concerns!

•Establish

conventions for smooth teamwork!

•Keep

Tuesday, November 19, 13

it testable!
Most tools use
some variant of

MVC
“Model, View, Controller"
Tuesday, November 19, 13
WARNING!

Tuesday, November 19, 13
“MVC” is used in
many different ways!

Tuesday, November 19, 13
MVC (ROUGHLY)
View
(UI)

Model
(data)
Controller
(interface)

Tuesday, November 19, 13
BUT SOMETIMES...
View

Model

Controller

Tuesday, November 19, 13
OTHER TIMES...
View

Presenter

Controller

Tuesday, November 19, 13

Model
OR EVEN...
View

Presenter

Controller

Tuesday, November 19, 13

Model
The Web App
Challenge

Tuesday, November 19, 13
CLASSIC RAILS APP
Browser

Server
Markup

DOM
UX
“The Page”

Model

HTTP
Request

Tuesday, November 19, 13

View

Controller
THE PROBLEMS:

Tuesday, November 19, 13
THE PROBLEMS:
•All

possible user actions must be precomputed

Tuesday, November 19, 13
THE PROBLEMS:
•All
•...

possible user actions must be precomputed

and embedded into the HTML

Tuesday, November 19, 13
THE PROBLEMS:
•All
•...

possible user actions must be precomputed

and embedded into the HTML

•Reloading

Tuesday, November 19, 13

the whole page every request
THE PROBLEMS:
•All
•...

possible user actions must be precomputed

and embedded into the HTML

•Reloading
•Some

the whole page every request

actions not possible without browser
interactivity

Tuesday, November 19, 13
HOW DO WE
ARCHITECT
A BROWSER APP?

Tuesday, November 19, 13
JS SINGLE-PAGE APP
Browser
App for user interaction
View

Model
Controller

Tuesday, November 19, 13

Server
Mostly persistence

Controller

Model
JS SINGLE-PAGE APP
Browser
App for user interaction
View

Model
Controller

Tuesday, November 19, 13

Server
Persistence Only!

Model
FOR MORE INFO

Tuesday, November 19, 13
FOR MORE INFO
Google Yehuda Katz’ Excellent Presentation:

Tuesday, November 19, 13
FOR MORE INFO
Google Yehuda Katz’ Excellent Presentation:

“A Tale of Two MVC’s”

Tuesday, November 19, 13
FOR MORE INFO
Google Yehuda Katz’ Excellent Presentation:

“A Tale of Two MVC’s”
From GoGaRuCo 2013

Tuesday, November 19, 13
FOR MORE INFO
Google Yehuda Katz’ Excellent Presentation:

“A Tale of Two MVC’s”
From GoGaRuCo 2013

Tuesday, November 19, 13
EMBER.JS &
ANGULARJS
BOTH USE “MVC”
THINKING

Tuesday, November 19, 13
BUT WITH DIFFERENT
PHILOSOPHIES...

Tuesday, November 19, 13
BUT WITH DIFFERENT
PHILOSOPHIES...
..LEADING TO DIFFERENT

ARCHITECTURES
Tuesday, November 19, 13
BROWSER APP?

Tuesday, November 19, 13
BROWSER APP?
Ember.js Sees:

Tuesday, November 19, 13
BROWSER APP?
Ember.js Sees:
Browser

Tuesday, November 19, 13

APP
BROWSER APP?
Ember.js Sees:
Browser

Tuesday, November 19, 13

APP

AngularJS Sees:
BROWSER APP?
Ember.js Sees:
Browser

Tuesday, November 19, 13

APP

AngularJS Sees:

Browser

App
PHILOSOPHY: EMBER

Tuesday, November 19, 13
PHILOSOPHY: EMBER
•Take

Tuesday, November 19, 13

known techniques for building apps
PHILOSOPHY: EMBER
•Take
•...

known techniques for building apps

concepts from Rails

Tuesday, November 19, 13
PHILOSOPHY: EMBER
•Take

known techniques for building apps

•...

concepts from Rails

•...

concepts from Cocoa

Tuesday, November 19, 13
PHILOSOPHY: EMBER
•Take

known techniques for building apps

•...

concepts from Rails

•...

concepts from Cocoa

•Apply

Tuesday, November 19, 13

them to the browser
PHILOSOPHY: ANGULAR

Tuesday, November 19, 13
PHILOSOPHY: ANGULAR
•Start

Tuesday, November 19, 13

from the browser - HTML and CSS
PHILOSOPHY: ANGULAR
•Start

from the browser - HTML and CSS

•Extend

Tuesday, November 19, 13

those concepts to app creation
PHILOSOPHY: ANGULAR
•Start

from the browser - HTML and CSS

•Extend

those concepts to app creation

•Angular

asks... What would markup look
like, if it were designed for building apps
instead of just pages?

Tuesday, November 19, 13
SHARED ASPECTS:

Tuesday, November 19, 13
SHARED ASPECTS:
•Single

Tuesday, November 19, 13

point of truth - the Model
SHARED ASPECTS:
•Single
•MVC

Tuesday, November 19, 13

point of truth - the Model

thinking
SHARED ASPECTS:
•Single
•MVC

thinking

•Routes

Tuesday, November 19, 13

point of truth - the Model

connect user actions to controllers
EMBER PRIORITIES

Tuesday, November 19, 13
EMBER PRIORITIES
•Unified

Tuesday, November 19, 13

interface to data
EMBER PRIORITIES
•Unified

interface to data

•Convention

Tuesday, November 19, 13

of structure
EMBER PRIORITIES
•Unified

interface to data

•Convention
•Sharing

Tuesday, November 19, 13

of structure

Of URLs
EMBER PRIORITIES
•Unified

interface to data

•Convention
•Sharing
•UI

Of URLs

Design

Tuesday, November 19, 13

of structure
ANGULAR PRIORITIES

Tuesday, November 19, 13
ANGULAR PRIORITIES
•Web-UX

Tuesday, November 19, 13

driven thinking
ANGULAR PRIORITIES
•Web-UX

driven thinking

•Isolatable

Tuesday, November 19, 13

/ testable code
ANGULAR PRIORITIES
•Web-UX

driven thinking

•Isolatable
•Add

Tuesday, November 19, 13

/ testable code

app features by augmenting the DOM
SYN-NAPS #1

Tuesday, November 19, 13
SYN-NAPS #1
•Attentional

Tuesday, November 19, 13

focus is best < 15 minutes
SYN-NAPS #1
•Attentional
•Best

focus is best < 15 minutes

to take breaks to let the synapses
recover

Tuesday, November 19, 13
SYN-NAPS #1
•Attentional

focus is best < 15 minutes

•Best

to take breaks to let the synapses
recover

•So

let’s do a little exercise to review

Tuesday, November 19, 13
DIFFERENT JOBS
NEED DIFFERENT

ARCHITECTURES
Tuesday, November 19, 13
GRAB A NEIGHBOR
NEXT TO YOU

Tuesday, November 19, 13
DISCUSS WITH THEM:

Tuesday, November 19, 13
DISCUSS WITH THEM:
1. An app that’s too small to need MVC

Tuesday, November 19, 13
DISCUSS WITH THEM:
1. An app that’s too small to need MVC
2. A small app that grew till it needed MVC

Tuesday, November 19, 13
DISCUSS WITH THEM:
1. An app that’s too small to need MVC
2. A small app that grew till it needed MVC
3. Any platform is fine!

Tuesday, November 19, 13
SYN-NAPS #1

Tuesday, November 19, 13
SYN-NAPS #1
3 minutes...
Tuesday, November 19, 13
SYN-NAPS #1
3 minutes... GO!
Tuesday, November 19, 13
SYN-NAPS #1

Tuesday, November 19, 13
SYN-NAPS #1
3 minutes...
Tuesday, November 19, 13
SYN-NAPS #1
3 minutes...
STOP!
Tuesday, November 19, 13
EMBER ARCHITECTURE
1:START

Tuesday, November 19, 13
EMBER ARCHITECTURE
1:START
Ember starts with
the URL/Route

Tuesday, November 19, 13
EMBER ARCHITECTURE
1:START
Ember starts with
the URL/Route
Loads Model

Tuesday, November 19, 13
EMBER ARCHITECTURE
1:START
Ember starts with
the URL/Route
Loads Model
Renders
Template

Tuesday, November 19, 13
EMBER ARCHITECTURE
1:START
Ember starts with
the URL/Route
Loads Model
Renders
Template
Adds Template
To DOM

Tuesday, November 19, 13
EMBER ARCHITECTURE
2: RUNTIME

Tuesday, November 19, 13
EMBER ARCHITECTURE
2: RUNTIME
Ember Watches for
Events

Tuesday, November 19, 13
EMBER ARCHITECTURE
2: RUNTIME
Ember Watches for
Events
Passes Events To
Controller (or bubbles
up to Route) to update
model

Tuesday, November 19, 13
EMBER ARCHITECTURE
2: RUNTIME
Ember Watches for
Events
Passes Events To
Controller (or bubbles
up to Route) to update
model
DOM auto-updates

Tuesday, November 19, 13
EMBER ARCHITECTURE
3: ROUTER

Tuesday, November 19, 13
EMBER ARCHITECTURE
3: ROUTER
•The

entry point for everything in Ember is
the router

Tuesday, November 19, 13
EMBER ARCHITECTURE
3: ROUTER
•The

entry point for everything in Ember is
the router

•Looks

Tuesday, November 19, 13

a lot like a routes.rb in Rails
EMBER ARCHITECTURE
3: ROUTER
•The

entry point for everything in Ember is
the router

•Looks

a lot like a routes.rb in Rails

•Different:

Controller
Tuesday, November 19, 13

Fetches the Model for the
EMBER ARCHITECTURE 4: ROUTER
App.Router.map(function() {
// put your routes here
});
App.IndexRoute = Ember.Route.extend({
model: function() {
return ['red', 'yellow', 'blue'];
}
});
<script type="text/x-handlebars">
<h2>Welcome to Ember.js</h2>
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="index">
<ul>
{{#each item in model}}
<li>{{item}}</li>
{{/each}}
</ul>

</script>
Tuesday, November 19, 13
EMBER ARCHITECTURE 4: TEMPLATE
App.Router.map(function() {
// put your routes here
});
App.IndexRoute = Ember.Route.extend({
model: function() {
return ['red', 'yellow', 'blue'];
}
});
<script type="text/x-handlebars">
<h2>Welcome to Ember.js</h2>
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="index">
<ul>
{{#each item in model}}
<li>{{item}}</li>
{{/each}}
</ul>

</script>
Tuesday, November 19, 13
EMBER ARCHITECTURE 5:
CONTROLLERS

Tuesday, November 19, 13
EMBER ARCHITECTURE 5:
CONTROLLERS
•Controllers

Ember:

Tuesday, November 19, 13

perform two functions in
EMBER ARCHITECTURE 5:
CONTROLLERS
•Controllers

perform two functions in

Ember:
• 1.

Add presentation to the model

Tuesday, November 19, 13
EMBER ARCHITECTURE 5:
CONTROLLERS
•Controllers

perform two functions in

Ember:
• 1.

Add presentation to the model

• 2.

Receive browser events and translate them to
semantic events

Tuesday, November 19, 13
EMBER ARCHITECTURE 5: CONTROLLERS
App.ContractController = Ember.ObjectController.extend({
fullName: function() {
return this.get(“firstName”) + “ “ + this.get(“lastName”);
}.properties(“firstName”, “lastName”)
});
<script type="text/x-handlebars" data-template-name=”contact”>
<div>My full name is: {{fullName}}</div>
</script>

Tuesday, November 19, 13
EMBER ARCHITECTURE 5: CONTROLLERS
App.ContractController = Ember.ObjectController.extend({
fullName: function() {
return this.get(“firstName”) + “ “ + this.get(“lastName”);
}.properties(“firstName”, “lastName”)
});
<script type="text/x-handlebars" data-template-name=”contact”>
<div>My full name is: {{fullName}}</div>
</script>

Tuesday, November 19, 13
EMBER ARCHITECTURE 5: CONTROLLERS
App.TicketsController = Ember.ArrayController.extend({
actions: {
addItem: function() {
this.pushObject(this.get(“ticket”));
}
}
});
<script type="text/x-handlebars" data-template-name="tickets">
<form {{action "addItem" on="submit"}}>
{{input value=ticket}}
<button type=submit>Add</button>
</form>
</script>

Tuesday, November 19, 13
EMBER ARCHITECTURE 5: CONTROLLERS
App.TicketsController = Ember.ArrayController.extend({
actions: {
addItem: function() {
this.pushObject(this.get(“ticket”));
}
}
});
<script type="text/x-handlebars" data-template-name="tickets">
<form {{action "addItem" on="submit"}}>
{{input value=ticket}}
<button type=submit>Add</button>
</form>
</script>

Tuesday, November 19, 13
EMBER ARCHITECTURE 6:
DATA BINDING

Tuesday, November 19, 13
EMBER ARCHITECTURE 6:
DATA BINDING
•Is

done with computed properties

Tuesday, November 19, 13
EMBER ARCHITECTURE 6:
DATA BINDING
•Is

done with computed properties

•Available

on Models, Controllers, Data
Stores, etc.

Tuesday, November 19, 13
EMBER ARCHITECTURE 6:
DATA BINDING
•Is

done with computed properties

•Available

on Models, Controllers, Data
Stores, etc.

•Define

a function property and add
dependencies to it with .properties()

Tuesday, November 19, 13
EMBER ARCHITECTURE 6: DATA BINDING
App.Ticket = Ember.Object.extend({
name: null,
priority: null,
abbreviation: function () {
shortName = this.get('name');
return shortName.slice(0,3);
}.property('name')
});

Tuesday, November 19, 13
EMBER ARCHITECTURE 6: DATA BINDING
App.Ticket = Ember.Object.extend({
name: null,
priority: null,
abbreviation: function () {
shortName = this.get('name');
return shortName.slice(0,3);
}.property('name')
});

Tuesday, November 19, 13
ANGULAR TIME!

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
1: STARTUP

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
1: STARTUP
Angular reads a
marked-up HTML file

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
1: STARTUP
Angular reads a
marked-up HTML file
Processes it according
to directives (yours
and AJS’s)

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
1: STARTUP
Angular reads a
marked-up HTML file
Processes it according
to directives (yours
and AJS’s)
Binds view elements to
Model data
Tuesday, November 19, 13
ANGULAR ARCHITECTURE
2: RUNTIME

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
2: RUNTIME
Angular watches for
events, and changes
to bound entities

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
2: RUNTIME
Angular watches for
events, and changes
to bound entities
Updates bound pairs,
calls watch methods

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
2: RUNTIME
Angular watches for
events, and changes
to bound entities
Updates bound pairs,
calls watch methods
Re-renders the DOM
as a result
Tuesday, November 19, 13
ANGULAR ARCHITECTURE
3: $SCOPE

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
3: $SCOPE
•A special JS object that groups all the stuff for the
current controller context.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
3: $SCOPE
•A special JS object that groups all the stuff for the
current controller context.

•Has inheritable properties and sub-scopes; a bit
magical

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
3: $SCOPE
•A special JS object that groups all the stuff for the
current controller context.

•Has inheritable properties and sub-scopes; a bit
magical

•Inheritance is determined by controller
inheritance.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
4:MODELS

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
4:MODELS
•A model is any JS object (not function!) assigned
as a property on the current $scope.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
4:MODELS
•A model is any JS object (not function!) assigned
as a property on the current $scope.

•No class to extend!

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
4:MODELS
•A model is any JS object (not function!) assigned
as a property on the current $scope.

•No class to extend!
•Automatically available to any controller that uses
that $scope or a sub-scope.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
4:MODELS
•A model is any JS object (not function!) assigned
as a property on the current $scope.

•No class to extend!
•Automatically available to any controller that uses
that $scope or a sub-scope.

•Automatically two-way bound to view elements
Tuesday, November 19, 13
ANGULAR ARCHITECTURE
5: CONTROLLERS

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
5: CONTROLLERS
•A controller is just any JS function that receives
and processes on a $scope.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
5: CONTROLLERS
•A controller is just any JS function that receives
and processes on a $scope.

•No class to extend or API to call!

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
5: CONTROLLERS
•A controller is just any JS function that receives
and processes on a $scope.

•No class to extend or API to call!
•Which controller is relevant is determined by the
markup.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
5: CONTROLLERS
•A controller is just any JS function that receives
and processes on a $scope.

•No class to extend or API to call!
•Which controller is relevant is determined by the
markup.

•Inheritance is determined by the markup, too!
Tuesday, November 19, 13
ANGULAR ARCHITECTURE 5: CONTROLLERS
<div ng-controller="SomeController">
{{name}} is {{comment}}!
<div ng-controller="InnerController">
{{name}} is {{comment}}!
</div>
</div>
function SomeController($scope, []) {
$scope.name = “Evan”
$scope.comment = “really cool”
}
function InnerController($scope, []) {
$scope.comment = “misinformed”
}
#output
Evan is really cool
Evan is misinformed

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 5: CONTROLLERS
<div ng-controller="SomeController">
{{name}} is {{comment}}!
<div ng-controller="InnerController">
{{name}} is {{comment}}!
</div>
</div>
function SomeController($scope, []) {
$scope.name = “Evan”
$scope.comment = “really cool”
}
function InnerController($scope, []) {
$scope.comment = “misinformed”
}
#output
Evan is really cool
Evan is misinformed

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 5: CONTROLLERS
<div ng-controller="SomeController">
{{name}} is {{comment}}!
<div ng-controller="InnerController">
{{name}} is {{comment}}!
</div>
</div>
function SomeController($scope, []) {
$scope.name = “Evan”
$scope.comment = “really cool”
}
function InnerController($scope, []) {
$scope.comment = “misinformed”
}
#output
Evan is really cool!
Evan is misinformed!

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
6: DATA BINDING

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
6: DATA BINDING
•Bound DOM elements and model data autoupdate each other.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
6: DATA BINDING
•Bound DOM elements and model data autoupdate each other.

•Other code like controller functions that depend
on model data are not auto-updated.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
6: DATA BINDING
•Bound DOM elements and model data autoupdate each other.

•Other code like controller functions that depend
on model data are not auto-updated.

•but $scope.$watch can create such bindings

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 6: DATA BINDING
<div ng-controller="SomeController">
<input type=‘text’ ng-model=‘name’></input>
You typed {{name}}!
</div>
function SomeController($scope, []) {
# name isn’t even mentioned!
# in fact you don’t even need the controller!
}

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 6: DATA BINDING
<div ng-controller="SomeController">
<input type=‘text’ ng-model=‘name’></input>
You typed {{name}}!
</div>
function SomeController($scope, []) {
# name isn’t even mentioned!
# in fact you don’t even need the controller!
}

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 6: DATA BINDING
<div ng-controller="SomeController">
<input type='text' ng-model='name'></input>
{{crazy_string}}
</div>
function SomeController($scope, []) {
$scope.crazy_string = $scope.name + " is crazy!";
}

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 6: DATA BINDING
<div ng-controller="SomeController">
<input type='text' ng-model='name'></input>
{{crazy_string}}
</div>
function SomeController($scope, []) {
$scope.crazy_string = $scope.name + " is crazy!";
}

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 6: DATA BINDING
<div ng-controller="SomeController">
<input type='text' ng-model='name'></input>
{{crazy_string}}
</div>
function SomeController($scope, []) {
$scope.crazy_string = $scope.name + " is crazy!";
}

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 6: DATA BINDING
<div ng-controller="SomeController">
<input type='text' ng-model='name'></input>
{{crazy_string}}
</div>
function SomeController($scope) {
$scope.$watch('name', function(){
$scope.crazy_string = $scope.name + " is crazy!";
})
}

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 6: DATA BINDING
<div ng-controller="SomeController">
<input type='text' ng-model='name'></input>
{{crazy_string}}
</div>
function SomeController($scope) {
$scope.$watch('name', function(){
$scope.crazy_string = $scope.name + " is crazy!";
})
}

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 6: DATA BINDING
<div ng-controller="SomeController">
<input type='text' ng-model='name'></input>
{{crazy_string}}
</div>
function SomeController($scope) {
$scope.$watch('name', function(){
$scope.crazy_string = $scope.name + " is crazy!";
})
}

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
7: DEPENDENCY INJECTION

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
7: DEPENDENCY INJECTION
•All elements get created created with a name (as
a string) they are known by.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
7: DEPENDENCY INJECTION
•All elements get created created with a name (as
a string) they are known by.

•Controllers, services, etc.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
7: DEPENDENCY INJECTION
•All elements get created created with a name (as
a string) they are known by.

•Controllers, services, etc.
•All elements get instantiated with a list of names
they depend on.

Tuesday, November 19, 13
ANGULAR ARCHITECTURE
7: DEPENDENCY INJECTION
•All elements get created created with a name (as
a string) they are known by.

•Controllers, services, etc.
•All elements get instantiated with a list of names
they depend on.

•This makes test isolation trivial
Tuesday, November 19, 13
ANGULAR ARCHITECTURE 7: DI
var ticketApp = angular.module('ticketApp', []);
ticketApp.factory('TicketList', function(){ # ... });
ticketApp.service(‘BackEndAjaxProvider’, function() { #... })
function TicketsController($scope, TicketList) { #... };
function TicketEditController($scope, [TicketList,
BackEndAjaxProvider]) { #... };

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 7: DI
var ticketApp = angular.module('ticketApp', []);
ticketApp.factory('TicketList', function(){ # ... });
ticketApp.service('BackEndAjaxProvider', function() { #... })
function TicketsController($scope, TicketList) { #... };
function TicketEditController($scope, [TicketList,
BackEndAjaxProvider]) { #... };

Tuesday, November 19, 13
ANGULAR ARCHITECTURE 7: DI
var ticketApp = angular.module('ticketApp', []);
ticketApp.factory('TicketList', function(){ # ... });
ticketApp.service(‘BackEndAjaxProvider’, function() { #... })
function TicketsController($scope, TicketList) { #... };
function TicketEditController($scope, TicketList,
BackEndAjaxProvider) { #... };

Tuesday, November 19, 13
SYN-NAPS #2

Tuesday, November 19, 13
SYN-NAPS #2
QUICK Q&A

Tuesday, November 19, 13
DEMO TIME!
(EMBER.JS)

Tuesday, November 19, 13
SYN-NAPS #3

Tuesday, November 19, 13
SYN-NAPS #3
PUPPY BREAK!

Tuesday, November 19, 13
Tuesday, November 19, 13
DEMO TIME!
(ANGULARJS)

Tuesday, November 19, 13
Thanks!
Evan Dorn
and Hannah Howard
Logical Reality Design
http://lrdesign.com
evan@lrdesign.com
@idahoev
hannah@techgirlwonder.com
@techgirlwonder

Tuesday, November 19, 13
Ad

More Related Content

Viewers also liked (6)

Integrating Ember.js into legacy applications
Integrating Ember.js into legacy applicationsIntegrating Ember.js into legacy applications
Integrating Ember.js into legacy applications
LevelbossMike
 
Parse Apps with Ember.js
Parse Apps with Ember.jsParse Apps with Ember.js
Parse Apps with Ember.js
Matthew Beale
 
Intro to emberjs
Intro to emberjsIntro to emberjs
Intro to emberjs
Mandy Pao
 
AngularJS - a radically different way of building Single Page Apps
AngularJS - a radically different way of building Single Page AppsAngularJS - a radically different way of building Single Page Apps
AngularJS - a radically different way of building Single Page Apps
jivkopetiov
 
Complex Architectures in Ember
Complex Architectures in EmberComplex Architectures in Ember
Complex Architectures in Ember
Matthew Beale
 
Ember.js the Second Step
Ember.js the Second StepEmber.js the Second Step
Ember.js the Second Step
Dopin Ninja
 
Integrating Ember.js into legacy applications
Integrating Ember.js into legacy applicationsIntegrating Ember.js into legacy applications
Integrating Ember.js into legacy applications
LevelbossMike
 
Parse Apps with Ember.js
Parse Apps with Ember.jsParse Apps with Ember.js
Parse Apps with Ember.js
Matthew Beale
 
Intro to emberjs
Intro to emberjsIntro to emberjs
Intro to emberjs
Mandy Pao
 
AngularJS - a radically different way of building Single Page Apps
AngularJS - a radically different way of building Single Page AppsAngularJS - a radically different way of building Single Page Apps
AngularJS - a radically different way of building Single Page Apps
jivkopetiov
 
Complex Architectures in Ember
Complex Architectures in EmberComplex Architectures in Ember
Complex Architectures in Ember
Matthew Beale
 
Ember.js the Second Step
Ember.js the Second StepEmber.js the Second Step
Ember.js the Second Step
Dopin Ninja
 

Similar to Architecture: ember.js and AngularJS (20)

Drupal 8 for site builders
Drupal 8 for site buildersDrupal 8 for site builders
Drupal 8 for site builders
swentel
 
App to App: Design and Surface Local APIs
App to App: Design and Surface Local APIsApp to App: Design and Surface Local APIs
App to App: Design and Surface Local APIs
Ty Smith
 
Inclusive & Accessible UX Practices – How Low-Fidelity Artifacts Promote Whol...
Inclusive & Accessible UX Practices – How Low-Fidelity Artifacts Promote Whol...Inclusive & Accessible UX Practices – How Low-Fidelity Artifacts Promote Whol...
Inclusive & Accessible UX Practices – How Low-Fidelity Artifacts Promote Whol...
Atomic Object
 
UI Engineer - the missing profession, devoxx 2013
UI Engineer - the missing profession, devoxx 2013UI Engineer - the missing profession, devoxx 2013
UI Engineer - the missing profession, devoxx 2013
Dierk König
 
Butter Web Browsing with Margarine
Butter Web Browsing with MargarineButter Web Browsing with Margarine
Butter Web Browsing with Margarine
Wayne Walls
 
Some simple tips for front-end performance in WordPress
Some simple tips for front-end performance in WordPressSome simple tips for front-end performance in WordPress
Some simple tips for front-end performance in WordPress
iparr
 
Angrybirds - Overview for a High Performance Shop
Angrybirds - Overview for a High Performance ShopAngrybirds - Overview for a High Performance Shop
Angrybirds - Overview for a High Performance Shop
AOE
 
Austin agile conf 2012 infrastructure automation-gmiranda
Austin agile conf 2012 infrastructure automation-gmirandaAustin agile conf 2012 infrastructure automation-gmiranda
Austin agile conf 2012 infrastructure automation-gmiranda
George Miranda
 
Inclusive and Accessible UX Practices: How Low-Fi Artifacts Promote Whole-Tea...
Inclusive and Accessible UX Practices: How Low-Fi Artifacts Promote Whole-Tea...Inclusive and Accessible UX Practices: How Low-Fi Artifacts Promote Whole-Tea...
Inclusive and Accessible UX Practices: How Low-Fi Artifacts Promote Whole-Tea...
Balanced Team
 
Lessons learned3yearsappstore
Lessons learned3yearsappstoreLessons learned3yearsappstore
Lessons learned3yearsappstore
Mohammad Azam
 
Beyond the Box: Opportunities in Augmented Reality
Beyond the Box: Opportunities in Augmented RealityBeyond the Box: Opportunities in Augmented Reality
Beyond the Box: Opportunities in Augmented Reality
AdvInteractions
 
3 d printer
3 d printer3 d printer
3 d printer
Hira Shaukat
 
Making the Switch, Part 1: Top 5 Things to Consider When Evaluating Drupal
Making the Switch, Part 1: Top 5 Things to Consider When Evaluating DrupalMaking the Switch, Part 1: Top 5 Things to Consider When Evaluating Drupal
Making the Switch, Part 1: Top 5 Things to Consider When Evaluating Drupal
Acquia
 
Calabash - Karl and Jonas
Calabash - Karl and JonasCalabash - Karl and Jonas
Calabash - Karl and Jonas
Xamarin
 
How to build an ecosystem for developers by David Bonilla
How to build an ecosystem for developers by David BonillaHow to build an ecosystem for developers by David Bonilla
How to build an ecosystem for developers by David Bonilla
Codemotion
 
Las maravillas de Google App Engine
Las maravillas de Google App EngineLas maravillas de Google App Engine
Las maravillas de Google App Engine
coto
 
Encuentro de desarrolladores moviles
Encuentro de desarrolladores movilesEncuentro de desarrolladores moviles
Encuentro de desarrolladores moviles
Carlos Solis
 
Embedjs
EmbedjsEmbedjs
Embedjs
Nikolai Onken
 
Creating Mobile Apps With PHP & Symfony2
Creating Mobile Apps With PHP & Symfony2Creating Mobile Apps With PHP & Symfony2
Creating Mobile Apps With PHP & Symfony2
Pablo Godel
 
Oredev 2013: Building Web Apps with Ember.js
Oredev 2013: Building Web Apps with Ember.jsOredev 2013: Building Web Apps with Ember.js
Oredev 2013: Building Web Apps with Ember.js
Jesse Cravens
 
Drupal 8 for site builders
Drupal 8 for site buildersDrupal 8 for site builders
Drupal 8 for site builders
swentel
 
App to App: Design and Surface Local APIs
App to App: Design and Surface Local APIsApp to App: Design and Surface Local APIs
App to App: Design and Surface Local APIs
Ty Smith
 
Inclusive & Accessible UX Practices – How Low-Fidelity Artifacts Promote Whol...
Inclusive & Accessible UX Practices – How Low-Fidelity Artifacts Promote Whol...Inclusive & Accessible UX Practices – How Low-Fidelity Artifacts Promote Whol...
Inclusive & Accessible UX Practices – How Low-Fidelity Artifacts Promote Whol...
Atomic Object
 
UI Engineer - the missing profession, devoxx 2013
UI Engineer - the missing profession, devoxx 2013UI Engineer - the missing profession, devoxx 2013
UI Engineer - the missing profession, devoxx 2013
Dierk König
 
Butter Web Browsing with Margarine
Butter Web Browsing with MargarineButter Web Browsing with Margarine
Butter Web Browsing with Margarine
Wayne Walls
 
Some simple tips for front-end performance in WordPress
Some simple tips for front-end performance in WordPressSome simple tips for front-end performance in WordPress
Some simple tips for front-end performance in WordPress
iparr
 
Angrybirds - Overview for a High Performance Shop
Angrybirds - Overview for a High Performance ShopAngrybirds - Overview for a High Performance Shop
Angrybirds - Overview for a High Performance Shop
AOE
 
Austin agile conf 2012 infrastructure automation-gmiranda
Austin agile conf 2012 infrastructure automation-gmirandaAustin agile conf 2012 infrastructure automation-gmiranda
Austin agile conf 2012 infrastructure automation-gmiranda
George Miranda
 
Inclusive and Accessible UX Practices: How Low-Fi Artifacts Promote Whole-Tea...
Inclusive and Accessible UX Practices: How Low-Fi Artifacts Promote Whole-Tea...Inclusive and Accessible UX Practices: How Low-Fi Artifacts Promote Whole-Tea...
Inclusive and Accessible UX Practices: How Low-Fi Artifacts Promote Whole-Tea...
Balanced Team
 
Lessons learned3yearsappstore
Lessons learned3yearsappstoreLessons learned3yearsappstore
Lessons learned3yearsappstore
Mohammad Azam
 
Beyond the Box: Opportunities in Augmented Reality
Beyond the Box: Opportunities in Augmented RealityBeyond the Box: Opportunities in Augmented Reality
Beyond the Box: Opportunities in Augmented Reality
AdvInteractions
 
Making the Switch, Part 1: Top 5 Things to Consider When Evaluating Drupal
Making the Switch, Part 1: Top 5 Things to Consider When Evaluating DrupalMaking the Switch, Part 1: Top 5 Things to Consider When Evaluating Drupal
Making the Switch, Part 1: Top 5 Things to Consider When Evaluating Drupal
Acquia
 
Calabash - Karl and Jonas
Calabash - Karl and JonasCalabash - Karl and Jonas
Calabash - Karl and Jonas
Xamarin
 
How to build an ecosystem for developers by David Bonilla
How to build an ecosystem for developers by David BonillaHow to build an ecosystem for developers by David Bonilla
How to build an ecosystem for developers by David Bonilla
Codemotion
 
Las maravillas de Google App Engine
Las maravillas de Google App EngineLas maravillas de Google App Engine
Las maravillas de Google App Engine
coto
 
Encuentro de desarrolladores moviles
Encuentro de desarrolladores movilesEncuentro de desarrolladores moviles
Encuentro de desarrolladores moviles
Carlos Solis
 
Creating Mobile Apps With PHP & Symfony2
Creating Mobile Apps With PHP & Symfony2Creating Mobile Apps With PHP & Symfony2
Creating Mobile Apps With PHP & Symfony2
Pablo Godel
 
Oredev 2013: Building Web Apps with Ember.js
Oredev 2013: Building Web Apps with Ember.jsOredev 2013: Building Web Apps with Ember.js
Oredev 2013: Building Web Apps with Ember.js
Jesse Cravens
 
Ad

Recently uploaded (20)

AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
Alan Dix
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In FranceManifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
chb3
 
HCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser EnvironmentsHCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser Environments
panagenda
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-UmgebungenHCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
panagenda
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
BookNet Canada
 
Quantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur MorganQuantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur Morgan
Arthur Morgan
 
Semantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AISemantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AI
artmondano
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?
Daniel Lehner
 
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
AI Changes Everything – Talk at Cardiff Metropolitan University, 29th April 2...
Alan Dix
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In FranceManifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
chb3
 
HCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser EnvironmentsHCL Nomad Web – Best Practices and Managing Multiuser Environments
HCL Nomad Web – Best Practices and Managing Multiuser Environments
panagenda
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
Role of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered ManufacturingRole of Data Annotation Services in AI-Powered Manufacturing
Role of Data Annotation Services in AI-Powered Manufacturing
Andrew Leo
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-UmgebungenHCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
panagenda
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
BookNet Canada
 
Quantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur MorganQuantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur Morgan
Arthur Morgan
 
Semantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AISemantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AI
artmondano
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?How Can I use the AI Hype in my Business Context?
How Can I use the AI Hype in my Business Context?
Daniel Lehner
 
Ad

Architecture: ember.js and AngularJS