160
Ember.js and AngularJS Two Architectures Compared Evan Dorn and Hannah Howard Logical Reality Design http://lrdesign.com [email protected] @idahoev [email protected] @techgirlwonder Tuesday, November 19, 13

Architecture: ember.js and AngularJS

Embed Size (px)

DESCRIPTION

An introduction to the different architectures of Ember and Angular, two leading JavaScript singlepage / MVC frameworks. This presentation was given to the Los Angeles RailsBridge "Architecture" meeting on October 25, 2013.

Citation preview

Page 2: Architecture: ember.js and AngularJS

How do I web application?

Tuesday, November 19, 13

Page 3: Architecture: ember.js and AngularJS

Simple apps can usesimple tools.

Tuesday, November 19, 13

Page 4: Architecture: ember.js and AngularJS

BIG APPS NEED

ARCHITECTURE

Tuesday, November 19, 13

Page 5: Architecture: ember.js and AngularJS

BIG APPS NEED

ARCHITECTURE•Keep it organized!

Tuesday, November 19, 13

Page 6: Architecture: ember.js and AngularJS

BIG APPS NEED

ARCHITECTURE•Keep it organized!

•Modularize your code!

Tuesday, November 19, 13

Page 7: Architecture: ember.js and AngularJS

BIG APPS NEED

ARCHITECTURE•Keep it organized!

•Modularize your code!

•Separate concerns!

Tuesday, November 19, 13

Page 8: Architecture: ember.js and AngularJS

BIG APPS NEED

ARCHITECTURE•Keep it organized!

•Modularize your code!

•Separate concerns!

•Establish conventions for smooth teamwork!

Tuesday, November 19, 13

Page 9: Architecture: ember.js and AngularJS

BIG APPS NEED

ARCHITECTURE•Keep it organized!

•Modularize your code!

•Separate concerns!

•Establish conventions for smooth teamwork!

•Keep it testable!

Tuesday, November 19, 13

Page 10: Architecture: ember.js and AngularJS

Most tools use some variant of

MVC“Model, View, Controller"

Tuesday, November 19, 13

Page 11: Architecture: ember.js and AngularJS

WARNING!

Tuesday, November 19, 13

Page 12: Architecture: ember.js and AngularJS

“MVC” is used in many different ways!

Tuesday, November 19, 13

Page 13: Architecture: ember.js and AngularJS

MVC (ROUGHLY)View(UI)

Model(data)

Controller(interface)

Tuesday, November 19, 13

Page 14: Architecture: ember.js and AngularJS

BUT SOMETIMES...

View Model

Controller

Tuesday, November 19, 13

Page 15: Architecture: ember.js and AngularJS

OTHER TIMES...

View Model

Controller

Presenter

Tuesday, November 19, 13

Page 16: Architecture: ember.js and AngularJS

OR EVEN...

View Model

Controller

Presenter

Tuesday, November 19, 13

Page 17: Architecture: ember.js and AngularJS

The Web App Challenge

Tuesday, November 19, 13

Page 18: Architecture: ember.js and AngularJS

Server

CLASSIC RAILS APP

View Model

Controller

Browser

DOM UX

“The Page”HTTP

Markup

Request

Tuesday, November 19, 13

Page 19: Architecture: ember.js and AngularJS

THE PROBLEMS:

Tuesday, November 19, 13

Page 20: Architecture: ember.js and AngularJS

THE PROBLEMS:•All possible user actions must be precomputed

Tuesday, November 19, 13

Page 21: Architecture: ember.js and AngularJS

THE PROBLEMS:•All possible user actions must be precomputed

•... and embedded into the HTML

Tuesday, November 19, 13

Page 22: Architecture: ember.js and AngularJS

THE PROBLEMS:•All possible user actions must be precomputed

•... and embedded into the HTML

•Reloading the whole page every request

Tuesday, November 19, 13

Page 23: Architecture: ember.js and AngularJS

THE PROBLEMS:•All possible user actions must be precomputed

•... and embedded into the HTML

•Reloading the whole page every request

•Some actions not possible without browser interactivity

Tuesday, November 19, 13

Page 24: Architecture: ember.js and AngularJS

HOW DO WE ARCHITECT

A BROWSER APP?

Tuesday, November 19, 13

Page 25: Architecture: ember.js and AngularJS

ServerMostly persistence

JS SINGLE-PAGE APP

ModelController

BrowserApp for user interaction

View Model

Controller

Tuesday, November 19, 13

Page 26: Architecture: ember.js and AngularJS

ServerPersistence Only!

JS SINGLE-PAGE APP

Model

BrowserApp for user interaction

View Model

Controller

Tuesday, November 19, 13

Page 27: Architecture: ember.js and AngularJS

FOR MORE INFO

Tuesday, November 19, 13

Page 28: Architecture: ember.js and AngularJS

FOR MORE INFO

Google Yehuda Katz’ Excellent Presentation:

Tuesday, November 19, 13

Page 29: Architecture: ember.js and AngularJS

FOR MORE INFO

Google Yehuda Katz’ Excellent Presentation:

“A Tale of Two MVC’s”

Tuesday, November 19, 13

Page 30: Architecture: ember.js and AngularJS

FOR MORE INFO

Google Yehuda Katz’ Excellent Presentation:

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

Tuesday, November 19, 13

Page 31: Architecture: ember.js and AngularJS

FOR MORE INFO

Google Yehuda Katz’ Excellent Presentation:

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

Tuesday, November 19, 13

Page 32: Architecture: ember.js and AngularJS

EMBER.JS & ANGULARJS

BOTH USE “MVC” THINKING

Tuesday, November 19, 13

Page 33: Architecture: ember.js and AngularJS

BUT WITH DIFFERENT PHILOSOPHIES...

Tuesday, November 19, 13

Page 34: Architecture: ember.js and AngularJS

BUT WITH DIFFERENT PHILOSOPHIES...

..LEADING TO DIFFERENT

ARCHITECTURESTuesday, November 19, 13

Page 35: Architecture: ember.js and AngularJS

BROWSER APP?

Tuesday, November 19, 13

Page 36: Architecture: ember.js and AngularJS

BROWSER APP?

Ember.js Sees:

Tuesday, November 19, 13

Page 37: Architecture: ember.js and AngularJS

BROWSER APP?

Ember.js Sees:

Browser APP

Tuesday, November 19, 13

Page 38: Architecture: ember.js and AngularJS

BROWSER APP?

Ember.js Sees:

Browser APP

AngularJS Sees:

Tuesday, November 19, 13

Page 39: Architecture: ember.js and AngularJS

BROWSER APP?

Ember.js Sees:

Browser APP

AngularJS Sees:

Browser App

Tuesday, November 19, 13

Page 40: Architecture: ember.js and AngularJS

PHILOSOPHY: EMBER

Tuesday, November 19, 13

Page 41: Architecture: ember.js and AngularJS

PHILOSOPHY: EMBER

•Take known techniques for building apps

Tuesday, November 19, 13

Page 42: Architecture: ember.js and AngularJS

PHILOSOPHY: EMBER

•Take known techniques for building apps

•... concepts from Rails

Tuesday, November 19, 13

Page 43: Architecture: ember.js and AngularJS

PHILOSOPHY: EMBER

•Take known techniques for building apps

•... concepts from Rails

•... concepts from Cocoa

Tuesday, November 19, 13

Page 44: Architecture: ember.js and AngularJS

PHILOSOPHY: EMBER

•Take known techniques for building apps

•... concepts from Rails

•... concepts from Cocoa

•Apply them to the browser

Tuesday, November 19, 13

Page 45: Architecture: ember.js and AngularJS

PHILOSOPHY: ANGULAR

Tuesday, November 19, 13

Page 46: Architecture: ember.js and AngularJS

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

Tuesday, November 19, 13

Page 47: Architecture: ember.js and AngularJS

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

•Extend those concepts to app creation

Tuesday, November 19, 13

Page 48: Architecture: ember.js and AngularJS

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

Page 49: Architecture: ember.js and AngularJS

SHARED ASPECTS:

Tuesday, November 19, 13

Page 50: Architecture: ember.js and AngularJS

SHARED ASPECTS:•Single point of truth - the Model

Tuesday, November 19, 13

Page 51: Architecture: ember.js and AngularJS

SHARED ASPECTS:•Single point of truth - the Model

•MVC thinking

Tuesday, November 19, 13

Page 52: Architecture: ember.js and AngularJS

SHARED ASPECTS:•Single point of truth - the Model

•MVC thinking

•Routes connect user actions to controllers

Tuesday, November 19, 13

Page 53: Architecture: ember.js and AngularJS

EMBER PRIORITIES

Tuesday, November 19, 13

Page 54: Architecture: ember.js and AngularJS

EMBER PRIORITIES•Unified interface to data

Tuesday, November 19, 13

Page 55: Architecture: ember.js and AngularJS

EMBER PRIORITIES•Unified interface to data

•Convention of structure

Tuesday, November 19, 13

Page 56: Architecture: ember.js and AngularJS

EMBER PRIORITIES•Unified interface to data

•Convention of structure

•Sharing Of URLs

Tuesday, November 19, 13

Page 57: Architecture: ember.js and AngularJS

EMBER PRIORITIES•Unified interface to data

•Convention of structure

•Sharing Of URLs

•UI Design

Tuesday, November 19, 13

Page 58: Architecture: ember.js and AngularJS

ANGULAR PRIORITIES

Tuesday, November 19, 13

Page 59: Architecture: ember.js and AngularJS

ANGULAR PRIORITIES•Web-UX driven thinking

Tuesday, November 19, 13

Page 60: Architecture: ember.js and AngularJS

ANGULAR PRIORITIES•Web-UX driven thinking

•Isolatable / testable code

Tuesday, November 19, 13

Page 61: Architecture: ember.js and AngularJS

ANGULAR PRIORITIES•Web-UX driven thinking

•Isolatable / testable code

•Add app features by augmenting the DOM

Tuesday, November 19, 13

Page 62: Architecture: ember.js and AngularJS

SYN-NAPS #1

Tuesday, November 19, 13

Page 63: Architecture: ember.js and AngularJS

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

Tuesday, November 19, 13

Page 64: Architecture: ember.js and AngularJS

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

•Best to take breaks to let the synapses recover

Tuesday, November 19, 13

Page 65: Architecture: ember.js and AngularJS

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

Page 66: Architecture: ember.js and AngularJS

DIFFERENT JOBSNEED DIFFERENT

ARCHITECTURES

Tuesday, November 19, 13

Page 67: Architecture: ember.js and AngularJS

GRAB A NEIGHBOR NEXT TO YOU

Tuesday, November 19, 13

Page 68: Architecture: ember.js and AngularJS

DISCUSS WITH THEM:

Tuesday, November 19, 13

Page 69: Architecture: ember.js and AngularJS

DISCUSS WITH THEM:

1. An app that’s too small to need MVC

Tuesday, November 19, 13

Page 70: Architecture: ember.js and AngularJS

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

Page 71: Architecture: ember.js and AngularJS

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

Page 72: Architecture: ember.js and AngularJS

SYN-NAPS #1

Tuesday, November 19, 13

Page 73: Architecture: ember.js and AngularJS

SYN-NAPS #1

3 minutes...

Tuesday, November 19, 13

Page 74: Architecture: ember.js and AngularJS

SYN-NAPS #1

3 minutes... GO!Tuesday, November 19, 13

Page 75: Architecture: ember.js and AngularJS

SYN-NAPS #1

Tuesday, November 19, 13

Page 76: Architecture: ember.js and AngularJS

SYN-NAPS #1

3 minutes...

Tuesday, November 19, 13

Page 77: Architecture: ember.js and AngularJS

SYN-NAPS #1

3 minutes... STOP!Tuesday, November 19, 13

Page 78: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE1:START

Tuesday, November 19, 13

Page 79: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE1:START

Ember starts with the URL/Route

Tuesday, November 19, 13

Page 80: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE1:START

Ember starts with the URL/Route

Loads Model

Tuesday, November 19, 13

Page 81: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE1:START

Ember starts with the URL/Route

Loads Model

Renders Template

Tuesday, November 19, 13

Page 82: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE1:START

Ember starts with the URL/Route

Loads Model

Renders Template

Adds Template To DOM

Tuesday, November 19, 13

Page 83: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE2: RUNTIME

Tuesday, November 19, 13

Page 84: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE2: RUNTIME

Ember Watches for Events

Tuesday, November 19, 13

Page 85: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE2: RUNTIME

Ember Watches for Events

Passes Events To Controller (or bubbles up to Route) to update model

Tuesday, November 19, 13

Page 86: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE2: RUNTIME

Ember Watches for Events

Passes Events To Controller (or bubbles up to Route) to update model

DOM auto-updates

Tuesday, November 19, 13

Page 87: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE3: ROUTER

Tuesday, November 19, 13

Page 88: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE3: ROUTER

•The entry point for everything in Ember is the router

Tuesday, November 19, 13

Page 89: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE3: ROUTER

•The entry point for everything in Ember is the router

•Looks a lot like a routes.rb in Rails

Tuesday, November 19, 13

Page 90: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE3: ROUTER

•The entry point for everything in Ember is the router

•Looks a lot like a routes.rb in Rails

•Different: Fetches the Model for the Controller

Tuesday, November 19, 13

Page 91: Architecture: ember.js and AngularJS

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

Page 92: Architecture: ember.js and AngularJS

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

Page 93: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE 5:CONTROLLERS

Tuesday, November 19, 13

Page 94: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE 5:CONTROLLERS

•Controllers perform two functions in Ember:

Tuesday, November 19, 13

Page 95: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE 5:CONTROLLERS

•Controllers perform two functions in Ember:

•1. Add presentation to the model

Tuesday, November 19, 13

Page 96: Architecture: ember.js and AngularJS

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

Page 97: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE 5: CONTROLLERSApp.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

Page 98: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE 5: CONTROLLERSApp.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

Page 99: Architecture: ember.js and AngularJS

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

Page 100: Architecture: ember.js and AngularJS

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

Page 101: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE 6:DATA BINDING

Tuesday, November 19, 13

Page 102: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE 6:DATA BINDING

•Is done with computed properties

Tuesday, November 19, 13

Page 103: Architecture: ember.js and AngularJS

EMBER ARCHITECTURE 6:DATA BINDING

•Is done with computed properties

•Available on Models, Controllers, Data Stores, etc.

Tuesday, November 19, 13

Page 104: Architecture: ember.js and AngularJS

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

Page 105: Architecture: ember.js and AngularJS

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

Page 106: Architecture: ember.js and AngularJS

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

Page 107: Architecture: ember.js and AngularJS

ANGULAR TIME!

Tuesday, November 19, 13

Page 108: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 1: STARTUP

Tuesday, November 19, 13

Page 109: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 1: STARTUP

Angular reads a marked-up HTML file

Tuesday, November 19, 13

Page 110: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 1: STARTUP

Angular reads a marked-up HTML file

Processes it according to directives (yours and AJS’s)

Tuesday, November 19, 13

Page 111: Architecture: ember.js and AngularJS

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

Page 112: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 2: RUNTIME

Tuesday, November 19, 13

Page 113: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 2: RUNTIME

Angular watches for events, and changes to bound entities

Tuesday, November 19, 13

Page 114: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 2: RUNTIME

Angular watches for events, and changes to bound entities

Updates bound pairs, calls watch methods

Tuesday, November 19, 13

Page 115: Architecture: ember.js and AngularJS

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

Page 116: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 3: $SCOPE

Tuesday, November 19, 13

Page 117: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 3: $SCOPE

•A special JS object that groups all the stuff for the current controller context.

Tuesday, November 19, 13

Page 118: Architecture: ember.js and AngularJS

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

Page 119: Architecture: ember.js and AngularJS

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

Page 120: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 4:MODELS

Tuesday, November 19, 13

Page 121: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 4:MODELS

•A model is any JS object (not function!) assigned as a property on the current $scope.

Tuesday, November 19, 13

Page 122: Architecture: ember.js and AngularJS

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

Page 123: Architecture: ember.js and AngularJS

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

Page 124: Architecture: ember.js and AngularJS

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

Page 125: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 5: CONTROLLERS

Tuesday, November 19, 13

Page 126: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 5: CONTROLLERS

•A controller is just any JS function that receives and processes on a $scope.

Tuesday, November 19, 13

Page 127: Architecture: ember.js and AngularJS

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

Page 128: Architecture: ember.js and AngularJS

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

Page 129: Architecture: ember.js and AngularJS

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

Page 130: Architecture: ember.js and AngularJS

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”}

#outputEvan is really coolEvan is misinformed

Tuesday, November 19, 13

Page 131: Architecture: ember.js and AngularJS

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”}

#outputEvan is really coolEvan is misinformed

Tuesday, November 19, 13

Page 132: Architecture: ember.js and AngularJS

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”}

#outputEvan is really cool!Evan is misinformed!

Tuesday, November 19, 13

Page 133: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 6: DATA BINDING

Tuesday, November 19, 13

Page 134: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 6: DATA BINDING

•Bound DOM elements and model data auto-update each other.

Tuesday, November 19, 13

Page 135: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 6: DATA BINDING

•Bound DOM elements and model data auto-update each other.

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

Tuesday, November 19, 13

Page 136: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 6: DATA BINDING

•Bound DOM elements and model data auto-update 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

Page 137: Architecture: ember.js and AngularJS

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

Page 138: Architecture: ember.js and AngularJS

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

Page 139: Architecture: ember.js and AngularJS

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

Page 140: Architecture: ember.js and AngularJS

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

Page 141: Architecture: ember.js and AngularJS

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

Page 142: Architecture: ember.js and AngularJS

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

Page 143: Architecture: ember.js and AngularJS

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

Page 144: Architecture: ember.js and AngularJS

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

Page 145: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 7: DEPENDENCY INJECTION

Tuesday, November 19, 13

Page 146: Architecture: ember.js and AngularJS

ANGULAR ARCHITECTURE 7: DEPENDENCY INJECTION

•All elements get created created with a name (as a string) they are known by.

Tuesday, November 19, 13

Page 147: Architecture: ember.js and AngularJS

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

Page 148: Architecture: ember.js and AngularJS

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

Page 149: Architecture: ember.js and AngularJS

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

Page 150: Architecture: ember.js and AngularJS

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

Page 151: Architecture: ember.js and AngularJS

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

Page 152: Architecture: ember.js and AngularJS

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

Page 153: Architecture: ember.js and AngularJS

SYN-NAPS #2

Tuesday, November 19, 13

Page 154: Architecture: ember.js and AngularJS

SYN-NAPS #2QUICK Q&A

Tuesday, November 19, 13

Page 155: Architecture: ember.js and AngularJS

DEMO TIME!(EMBER.JS)

Tuesday, November 19, 13

Page 156: Architecture: ember.js and AngularJS

SYN-NAPS #3

Tuesday, November 19, 13

Page 157: Architecture: ember.js and AngularJS

SYN-NAPS #3PUPPY BREAK!

Tuesday, November 19, 13

Page 158: Architecture: ember.js and AngularJS

Tuesday, November 19, 13

Page 159: Architecture: ember.js and AngularJS

DEMO TIME!(ANGULARJS)

Tuesday, November 19, 13