Ember.js

Facile.it 2014

BANALITà


Ember.js è un framework scritto in javascript per creare applicazioni client side


Come angular.js o backbone.js


Url is king


spa = Single page application

spa != url fissa


Gestione URL sensata out of the box

the ember way

ogni problema va affrontanto seguendo i principi del framework


Spesso esiste un solo modo di risolvere un problema con Ember.js


Principi da seguire

#1 ember.js impone una nomenclatura specifica per tutte le classi


// definita la rotta `contratto`, Ember.js cercherà le seguenti classi

App.ContrattoRoute = Ember.Route.extend()

App.ContrattoController = Ember.Controller.extend()

App.ContrattoView = Ember.View.extend()


Convention over configuration, è fondamentale seguire le naming conventions imposte dal framework.

#2 Un'applicazione è composta da diverse classi


Tutte le classi definite nel nostro sorgente sono degli override di classi che Ember genera automaticamente a runtime.


È necessario definire una classe solo se vogliamo estendere il comportamento di default previsto da Ember.




#2 Esempio


Definizione di classe ridondante, perchè verrebbe generata automaticamente da Ember
 App.ContrattoRoute = Ember.Route.extend();

Definizione di classe sensata, perchè differisce dall'implementazione di default
 App.ContrattoRoute = Ember.Route.extend({
setupController: function(controller, model) {
controller.set('oggi', new Date());
}
});




#3 Controller != controller


Ember.js è un framework MVC ma la terminologia non è sempre comparabile a quella di framework server side.


I Controller in Ember sono dumb, la loro unica funzione è fornire dati ai template.

Dove mettere la logica dell'applicazione?


ROUTES

Business logic


Controller

Presentation logic


#4 in javascript l'i/o è asincrono


È fondamentale capire come funzionano i run loop.


Ember.js utilizza pesantemente le promises.


Con le promises diventa tutto un po' più semplice :)

#5 L'object model


Ogni classe eredita da Ember.Object


Usare sempre i getter e i setter per evitare problemi con gli observables e le computed properties.


Una classe può estendere diversi mixin (simili ai traits in PHP).

#5 L'object model in pratica


Definizione di classe con extend

var Cibo = Ember.Object.extend({
calorie: null,
soddisfazione: null
});
Nuova istanza con create
var pizza = Cibo.create({
soddifazione: 7
});

pizza.set('calorie', 266);
Proprietà e metodi statici con reopenClass
Cibo.reopenClass({
oraDiPranzo: function() {
var ore = (new Date()).getHours();
return ore > 11 && ore < 15;
}
});

Cibo.oraDiPranzo(); // purtroppo false

I building blocks


I building blocks


Route Ha accesso all'url, carica i models (con chiamate al server) e contiene la logica dell'applicazione


Controller Riceve i dati dalla Route e li fornisce alla View


View Renderizza il template e interagisce direttamente con il DOM (es. per usare plugin jQuery)


Template Ember.js usa handlebars come linguaggio di templating

UNA mini app in 20 righe

Integrazione con le api di Reddit.

DEMO http://emberjs.jsbin.com/likenosa/7


App = Ember.Application.create();

App.Router.map(function() {
this.route('subreddit', { path: '/r/:subreddit' });
});

App.IndexRoute = Ember.Route.extend({
model: function() {
return Ember.$.getJSON('http://www.reddit.com/reddits.json?jsonp=?');
}
});

App.SubredditRoute = Ember.Route.extend({
model: function(params) {
var url = 'http://www.reddit.com/r/' + params.subreddit + '.json?jsonp=?';
return Ember.$.getJSON(url);
}
});

Lista subreddits

http://www.reddit.com/reddits.json

{
"data": {
"children": [
{ "data": { "display_name": "pics" } },
{ "data": { "display_name": "funny" } },
{ "data": { "display_name": "aww" } }
]
}
}

subreddit.hbs

<ul>
{{#each item in model.data.children}}
<li>
<a href="/#/r/{{unbound item.data.display_name}}">
{{item.data.display_name}}
</a>
</li>
{{/each}}
</ul>

unbound è un helper che indica ad Ember di non osservare la proprietà, ma di inserire semplicemente il valore nel template.

Lista POST

http://www.reddit.com/r/aww.json

{
"data": {
"children": [
{
"data": { "thumbnail": "http://...", "permalink": "http://...", "title": "Ember FTW" }
},
{ ... },
...
]
}
}
post_list.hbs
<ul>
{{#each item in model.data.children}}
<li>
<img src="{{unbound item.data.thumbnail}}">
<a href="{{unbound item.data.url}}">
{{item.data.title}}
</a>
</li>
{{/each}}
</ul>

Ultime considerazioni


Ember.js è ufficialmente stabile da Settembre 2013


Ember Data - adapter semi ufficiale per gestire i model

Caldamente consigliato, anche se ancora non production ready



Fatevi un favore ed usate un build tool

Brunch - il più facile

Grunt - il più famoso ed il più lento

Gulp - il più veloce ed uno dei più semplici

Broccoli - (sì esiste veramente) il più promettente

Ember.js

By Marco Sampellegrini