+ All Categories
Transcript
Page 2: Modular applications with montage components
Page 3: Modular applications with montage components

modules

template

mobile

componentHTML5

encapsulated

MVC

data-binding

promises CommonJS

declarative

BSD

serialization

package

separation of concernsreusable

ECMAScript 5

composition

TEAMworkflow

simplify

write once batterygpucpuapplications

property change

listener

CSS

framework

widgetsflow repetition condition

substitution

text

button

loader

listprogress

slider

inputaudioslot

videocheckbox

radiotoggle

textfield

event

cross-platform

deferred drawing

Page 4: Modular applications with montage components

Mobile Applications

Page 5: Modular applications with montage components
Page 6: Modular applications with montage components
Page 7: Modular applications with montage components

HTML5 vs Native

Page 8: Modular applications with montage components

HTML5 vs Native

Janky User Experience

Page 9: Modular applications with montage components

HTML5 vs Native

Janky User Experience

Longer Development Time

Page 10: Modular applications with montage components

HTML5 vs Native

Janky User Experience

Longer Development Time

Higher Development Cost

Page 11: Modular applications with montage components

HTML5 vs Native

Janky User Experience

Longer Development Time

Higher Development Cost

Harder to Iterate

Page 12: Modular applications with montage components

Modular Applications

Page 13: Modular applications with montage components

Simple Application

Page 14: Modular applications with montage components

Large Application

Page 15: Modular applications with montage components

Large Application

Page 16: Modular applications with montage components

Montage Application

Refactor

Page 17: Modular applications with montage components

Refactor

Montage Application

Page 18: Modular applications with montage components

Popcorn Demo

montagejs.org/apps/popcorn/

Page 19: Modular applications with montage components

Component

Assigned one DOM Element

MVC Structure

From Widget to App Specific

Deferred Drawing

Template

Page 20: Modular applications with montage components

Deferred Drawing

Maximize Performance

Orchestrate DOM Changes

Third Party Components

Degrade Gracefully

willDraw() / draw() / didDraw()

Page 21: Modular applications with montage components

Template

Full HTML5 document

Resource Encapsulation

Object Serialization

Great JS / CSS Team Work

Automatic Dependencies Load

.reelHTML JS CSS

Page 22: Modular applications with montage components
Page 23: Modular applications with montage components

Identify Components

Page 24: Modular applications with montage components

Main ComponentLoads data from Web Service

Relies on sub-components for presentation

Page 25: Modular applications with montage components

Movie Content

Navigation

Page 26: Modular applications with montage components

Movie Content

Navigation

Components establish their own API to accept data through properties

or methods

MainMovie Categories

Event to change CategoryId

Selected CategoryId

Page 27: Modular applications with montage components

MainMovie Categories

Event to change CategoryId

Selected CategoryId

Page 28: Modular applications with montage components

MainMovie Categories

Event to change CategoryId

Selected CategoryId

Page 29: Modular applications with montage components

Movie Content

Page 30: Modular applications with montage components

Movie Content

Flow Component

Movie Detail Component

Page 31: Modular applications with montage components

Movie Detail Component

Flow Component

Movie ContentmoviesController

selectedMovie

Page 32: Modular applications with montage components

<html>...<body> <div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div></body></html>

Main.reel/Main.html

Page 33: Modular applications with montage components

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

Markup

Object Serialization<script type="text/montage-serialization">{ "owner": { "properties": { "element": {"#": "facade-flow"} } },

... "flow": { "prototype": "montage/ui/flow.reel", "properties": { "element": {"#": "flow"}, "isSelectionEnabled": false, "cameraFov": 36.99, "cameraTargetPoint": [0, 0, 0], "stride": 1 }, "bindings": { "contentController": {"<-": "@owner.buttonController"} } },

"details": { "prototype": "ui/details.reel", "properties": { "element": {"#": "details"} }, "bindings": { "data": {"<-": "@owner.selectedMovie" } } }}</script>

Page 34: Modular applications with montage components

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

<script type="text/montage-serialization">{ "owner": { "properties": { "element": {"#": "facade-flow"} } },

... "flow": { "prototype": "montage/ui/flow.reel", "properties": { "element": {"#": "flow"}, "isSelectionEnabled": false, "cameraFov": 36.99, "cameraTargetPoint": [0, 0, 0], "stride": 1 }, "bindings": { "contentController": {"<-": "@owner.buttonController"} } },

"details": { "prototype": "ui/details.reel", "properties": { "element": {"#": "details"} }, "bindings": { "data": {"<-": "@owner.selectedMovie" } } }}</script>

Page 35: Modular applications with montage components

"flow": { "prototype": "montage/ui/flow.reel", "properties": { "element": {"#": "flow"}, "cameraFov": 36.99, "cameraTargetPoint": [0, 0, 0], "stride": 1 }, "bindings": { "contentController": {"<-": "@owner.moviesController"} } },

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

Module Id

Page 36: Modular applications with montage components

"flow": { "prototype": "montage/ui/flow.reel", "properties": { "element": {"#": "flow"}, "cameraFov": 36.99, "cameraTargetPoint": [0, 0, 0], "stride": 1 }, "bindings": { "contentController": {"<-": "@owner.moviesController"} } },

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

Setting Property Values

Page 37: Modular applications with montage components

"flow": { "prototype": "montage/ui/flow.reel", "properties": { "element": {"#": "flow"}, "cameraFov": 36.99, "cameraTargetPoint": [0, 0, 0], "stride": 1 }, "bindings": { "contentController": {"<-": "@owner.moviesController"} } },

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

data binding

Page 38: Modular applications with montage components

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

"details": { "prototype": "ui/details.reel", "properties": { "element": {"#": "details"} }, "bindings": { "data": {"<-": "@owner.selectedMovie" } } },

Page 39: Modular applications with montage components

Movie Detail

Page 40: Modular applications with montage components

Movie Detail

Title

SynopsisTrailer Button

Rent Button

Release Date Runtime Audience Critics

Page 41: Modular applications with montage components

Movie Detail Components

DynamicText

DynamicText

DynamicText DynamicText Dynamic Text Dynamic Text

Button

Button

Page 42: Modular applications with montage components

Movie Detail

Title

Description

Date Runtime Audience

Critics

Trailer Button

Rent Button

data.title

data.date

actionEvent

actionEvent

data.criticScore

data.synopsis

data.runtimedata.audienceScore

Page 43: Modular applications with montage components

Trailer Button

action event

Page 44: Modular applications with montage components

"trailerButton": { "prototype": "montage/ui/button.reel", "properties": { "element": {"#": "trailer-button"} }, "listeners": [ { "type": "action", "listener": {"@": "owner"} } ] },

<button data-montage-id="trailer-button">Trailer</button>

Listeners

Page 45: Modular applications with montage components

"trailerButton": { "prototype": "montage/ui/button.reel", "properties": { "element": {"#": "trailer-button"} }, "listeners": [ { "type": "action", "listener": {"@": "owner"} } ] },

<button data-montage-id="trailer-button">Trailer</button>

Object Reference

Page 46: Modular applications with montage components

"trailerButton": { "prototype": "montage/ui/button.reel", "properties": { "element": {"#": "trailer-button"} }, "listeners": [ { "type": "action", "listener": {"@": "owner"} } ] },

handleTrailerButtonAction: { value: function(event) {

...}

}handleAction

handleEvent

Owner EventHandling

MethodPrecedence

Page 47: Modular applications with montage components
Page 48: Modular applications with montage components

Mop it!

Page 49: Modular applications with montage components

Modular Applications

Encapsulated Components

HTML5 Templates

Scale Larger Team/Projects

Shorter Development Time

Easier to Refactor

Page 50: Modular applications with montage components

Q&A

Page 51: Modular applications with montage components

A modern HTML5 framework

montagejs.orgBenoît [email protected]

Fork me on GitHub


Top Related