Upload
adam-kloboucnik
View
388
Download
3
Embed Size (px)
DESCRIPTION
Slides for talk given on November PragueJS meetup (http://www.praguejs.cz/talks/#november-2013)
Citation preview
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Ember DataAdam Kloboučník, GoodData@akloboucnik
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Ember Data
▶ client data-persistence library▶ for Ember.js
▶ still beta-quality▶ strongly opinionated (naming, url + model
schema)▶ “trivial choices are enemy” ~ @wycats
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Complications
Data
Web Applications
merge problems
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Complications
User
Post
Comment
changes
dirty checking
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Complications
▶ merge problems▶ dirty checking▶ async
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Ember Data architecture
DataREST API
LocalStorage
Google Spreadsheet
Adapter
Serializer
Store
“Talks” protocol
Extracts raw data to Models
Persists models
Models
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
ModelsApp.Post = DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string'),
comments: DS.hasMany('comment', {async:
true})
});
App.Comment = DS.Model.extend({
content: DS.attr('string'),
post: DS.belongsTo('post')
});
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Adapter
▶ provides protocol abstraction▶ RESTAdapter, FixtureAdapter provided▶ LocalStorageAdapter, many others...
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Intermezzo - promises
▶ “eventual value returned from completion of operation”function callApi(id) {
var promise = longRunningOperation(id);
return promise;
}
//....
callApi(2).then(function(result) {
// do sth with resolved result
}, function(err) {
// do sth with rejection
});
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Store
▶ querying and saving▶ store.find[All,Query](‘model-name’[, id]);▶ model_object.save();▶ both finders and save return promises for developer
sanity (formerly a state chart with actions on edges)▶ Em.RSVP.all([promise1, promise2]).then ...
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Notes
▶ identity map▶ sideloading▶ optimize you API for easier life (jsonapi.org)
▶ active_model_serializers in Rails▶ :-( elsewhere
▶ alternatives▶ Ember.Resource▶ Ember.Model▶ EPF
▶ sources - emberjs.com/guides, source
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
▶ really young now, but▶ provides clean separation of concerns
▶ developing client app without backend▶ testing adapter code without rest of the app▶ …
▶ “best practices” for api modelling▶ integrates greatly with Ember if you use it
Conclusion
GoodData Confidential. 2013 GoodData Corporation. All rights reserved.
Thank you!
@akloboucnik