Download - SproutCore: Amber

Transcript
Page 1: SproutCore: Amber

SproutCore

Page 2: SproutCore: Amber
Page 3: SproutCore: Amber

Why?

Page 4: SproutCore: Amber

building large apps in jQuery

Page 5: SproutCore: Amber

?

?

View (DOM Manipulation)

Page 6: SproutCore: Amber

Model (.data)

Controller (.bind)

View (DOM Manipulation)

Page 7: SproutCore: Amber

jQuery

jQuery

jQuery

Page 8: SproutCore: Amber
Page 9: SproutCore: Amber

Following 187

Page 10: SproutCore: Amber

Following 188

Page 11: SproutCore: Amber

$(".follow-me").live("click", function() { var link = $(this).parent().prev(); var count = parseInt($("#following span.count").text());

var newLink = $("<li class='user'>") .append(link.clone());

$("#following").prepend(newLink); $("#following span.count").text(count + 1);});

Page 12: SproutCore: Amber

D E F G

Following 187

Who to follow

Awycats · FollowYehuda Katz

Bokito · FollowCharles Jolley

Cwifelette · FollowLeah Silber

Page 13: SproutCore: Amber

D E F G

Following 187

Who to follow

Awycats · FollowYehuda Katz

Bokito · FollowCharles Jolley

Cwifelette · FollowLeah Silber

Page 14: SproutCore: Amber

Edge casesStart with less than 4

D E F

Following 187

Who to follow

Awycats · FollowYehuda Katz

Bokito · FollowCharles Jolley

Cwifelette · FollowLeah Silber

Page 15: SproutCore: Amber

Edge casesStart with less than 4Unfollowing

A D E F

Following 188

Who to follow

Awycats · UnfollowYehuda Katz

Bokito · FollowCharles Jolley

Cwifelette · FollowLeah Silber

Page 16: SproutCore: Amber

What's wrong?

Page 17: SproutCore: Amber

Views need to know about each other

Page 18: SproutCore: Amber

There are lots of views

Page 19: SproutCore: Amber

There are lots of views

Page 20: SproutCore: Amber

More complex apps==

more spaghetti

Page 21: SproutCore: Amber

What's the right way?

Page 22: SproutCore: Amber

Model objects

Page 23: SproutCore: Amber

User

guidusernamegravatarisFollowed

Page 24: SproutCore: Amber

self-contained

views

Page 25: SproutCore: Amber

D E F G

Following 187

following.length

following[N]

[1][0] [2] [3]

Page 26: SproutCore: Amber

Who to follow

Awycats · FollowYehuda Katz

Bokito · FollowCharles Jolley

Cwifelette · FollowLeah Silber

A.isFollowed

B.isFollowed

C.isFollowed

users

[0]

[1]

[2]

Page 27: SproutCore: Amber

D E F G

Following 187

following

Who to follow

Awycats · FollowYehuda Katz

Bokito · FollowCharles Jolley

Cwifelette · FollowLeah Silber

recommendations

Page 28: SproutCore: Amber

wired together by

the page

Page 29: SproutCore: Amber

Twitter.following

User

isFollowedChanged: function() { var followed = this.get('isFollowed');

if(followed) { Twitter.following.unshiftObject(this); } else { Twitter.following.removeObject(this); }}.observes('isFollowed')

D E F G

Following 187

following

Users

Page 30: SproutCore: Amber

Who to follow

Awycats · FollowYehuda Katz

Bokito · FollowCharles Jolley

Cwifelette · FollowLeah Silber

recommendations

Twitter.recommendations

Users

Page 31: SproutCore: Amber

Who to follow

Awycats · FollowYehuda Katz

Bokito · FollowCharles Jolley

Cwifelette · FollowLeah Silber

recommendations

Twitter.recommendations

Users

click =>user.set('isFollowed', true)

Page 32: SproutCore: Amber

What's Happening

Here?

Page 33: SproutCore: Amber

D E F G

Following 187

following

Who to follow

Awycats · FollowYehuda Katz

Bokito · FollowCharles Jolley

Cwifelette · FollowLeah Silber

recommendations

TotallyIsolatedViews

Page 34: SproutCore: Amber

TotallyIsolatedModels

User

guidusernamegravatarisFollowed

isFollowedChanged

Page 35: SproutCore: Amber

Glued Together By the App

SC.MainPage.append({ pickFollowers: Twitter.PickFollowers.design({ recommendationsBinding: "Twitter.recommendations" }), listFollowers: Twitter.FollowerList.design({ followingBinding: "Twitter.following" })});

Page 36: SproutCore: Amber

Views?

Page 37: SproutCore: Amber
Page 38: SproutCore: Amber

SC.TemplateView

Page 39: SproutCore: Amber

Twitter.FollowersList = SC.TemplateView.extend({ // display property following: [], template: "followers_list",});

Page 40: SproutCore: Amber

creates render

method for you

Page 41: SproutCore: Amber

<ul> {{#bind following}} <li data-guid="{{guid}}"> <a href="#!/{{username}}"> <img src="{{gravatar}}" /> </a> </li> {{/bind}}</ul>

Page 42: SproutCore: Amber

Mustache++

Page 43: SproutCore: Amber

Handlebars.js

Page 44: SproutCore: Amber

{{#bind following}}

Page 45: SproutCore: Amber

“Listen to changes in the following Array. If an element is added, render a new <li>. If an element is removed, remove it.

Page 46: SproutCore: Amber

Syntax and impl are a

work in progress

Page 47: SproutCore: Amber

Works for simple

properties

Page 48: SproutCore: Amber

<div class="post"> <h1>{{bind title}}</h1> <div class="body">{{bind body}}</div></div>

Page 49: SproutCore: Amber

What about getting

remote data?

Page 50: SproutCore: Amber

Twitter.following = [];

$.getJSON("/following", function(json) { var users = json.users.map(function(post) { return Twitter.User.create(post); }); Twitter.set('following', users);});

Page 51: SproutCore: Amber

Twitter.User?

Page 52: SproutCore: Amber

Twitter.User = SC.Object.extend({ // documentation isFollowed: false, username: null, gravatar: null,

isFollowedChanged: function() { var followed = this.get('isFollowed');

if(followed) { Twitter.following.unshiftObject(this); } else { Twitter.following.removeObject(this); } }.observes('isFollowed')});

Page 53: SproutCore: Amber

To Recap

Page 54: SproutCore: Amber

Benefits: Isolation

Page 55: SproutCore: Amber

$(".follow-me").live("click", function() { var link = $(this).parent().prev(); var count = parseInt($("#following span.count").text());

var newLink = $("<li class='user'>") .append(link.clone());

$("#following").prepend(newLink); $("#following span.count").text(count + 1);});

Page 56: SproutCore: Amber

$(".follow-me").live("click", function() { var link = $(this).parent().prev(); var count = parseInt($("#following span.count").text());

var newLink = $("<li class='user'>") .append(link.clone());

$("#following").prepend(newLink); $("#following span.count").text(count + 1);}); X

Page 57: SproutCore: Amber

Makes totally rewriting

parts of the view feasible

Page 58: SproutCore: Amber

Makes totally rewriting

parts of the view trivial

Page 59: SproutCore: Amber

Keeps data model

concerns out of the view

Page 60: SproutCore: Amber

Makes revising large areas of the view simpler

Page 61: SproutCore: Amber

I Haven't Touched on Controllers

Page 62: SproutCore: Amber

This is a very simple

example

Page 63: SproutCore: Amber

Controllers add view

concerns to objects

Page 64: SproutCore: Amber

e.g. ArrayController has 'selection'

Page 65: SproutCore: Amber

Mockup Ideas

Page 67: SproutCore: Amber

Thanks!


Top Related