Alternatives to Ember Data

Philip Poots · 19 Jun 2013

When considering whether or not to use Ember.js, some stumble because Ember Data isn’t considered production ready. This is a little unfortunate given that you can use Ember without Ember Data by communicating directly with the server via AJAX.

However, for those who want want more than jQuery’s $.ajax(), here are five alternatives worth checking out as a stop gap or replacement.

Ember-Model

Ember-Model is a lightweight model library extracted from a real application by Ember.js core-team member Erik Bryn. It supports a limited feature set in favour of speed and simplicity.

model_store.js

App.User = Ember.Model.extend({
  id: Ember.attr(),
  name: Ember.attr()
});

App.User.url = "/users";
App.User.adapter = Ember.RESTAdapter.create();

// Create and save a new user
var newUser = App.user.create({name: "Erik"});
newUser.save(); // POST /users.json

// Fetch an existing user
var existingUser = App.User.find(1); // GET /users/1.json

// Update an existing user
existingUser.set('name', 'Kris');
existingUser.save() // PUT /users/1.json

Erik has produced a helpful screencast covering Ember-Model in more detail. Check out Ember-Model on GitHub.

Ember-Resource

Ember-Resource has come out of Zendesk, the customer support company. It was most likely extracted from their online help desk, which is one of Ember’s earliest production applications.

resource_store.js

App.User = Ember.Resource.define({
  url: '/users',
  schema: {
    id:    Number,
    name:  String
  }
});

// Create and save a new user
var newUser = App.User.create({name: "James"});
newUser.save(); // POST /users.json

// Fetch an existing user
existingUser = App.User.create({id: 1}).fetch(); // GET /users/1.json

// Update an existing user
existingUser.set('name', 'Nathan');
existingUser.save(); // PUT /users/1.json

// Destroy an existing user
existingUser.destroy(); // DELETE /users/1.json

Grab a hold of Ember-Resource on Github.

Ember-RESTless

A library with a lightweight focus on the simple features of Ember Data is Ember-RESTless.

restless_store.js

App.RESTAdapter = RL.RESTAdapter.create({
  url: 'http://api.example.com'
});

App.Client = RL.Client.create({
  adapter: App.RESTAdapter
});

App.User = RL.Model.extend({
  name: RL.attr('string')
});

// Create and save a new user
var newUser = App.User.create({name: "Garth"});
newUser.saveRecord(); // POST /users.json

// Fetch an existing user
var existingUser = App.Post.find(1); // GET /users/1.json

// Update an existing user
existingUser.set('name', 'Gopal');
existingUser.saveRecord(); // PUT /users/1.json

// Destroy an existing user
existingUser.deleteRecord(); // DELETE /users/1.json

Read more about Ember-RESTless on GitHub.

Emu

Emu is a simple data access library for Ember.js

emu_store.js

App.Store = Emu.Store.extend({
  revision: 1
});

App.User = Emu.Model.extend({
  name: Emu.field("string")
});

// Create and save a new user
var newUser = App.User.createRecord({name: "Charlie"});
newUser.save(); // POST /users.json

// Fetch an existing user
existingUser = App.User.find(1); // GET /users/1.json

// Update an existing user
existingUser.set('name', 'Jonnii');
existingUser.save(); // PUT /users/1.json

// Destroy an existing user
App.User.deleteRecord(existingUser); // DELETE /users/1.json

See Emu on GitHub.

Ember-REST

Creator Dan Gebhardt brands Ember-REST as a very simple library for RESTful resources that he extracted from an example app.

rest_store.js

App.User = Ember.Resource.extend({
  resourceUrl: '/users',
  resourceName: 'user',
  resourceProperties: ['name']
});

// Create and save a new user
var newUser = App.User.create({name: "Dan"});
newUser.saveResource(); // POST /users.json

// Fetch an existing user
existingUser = App.User.create({id: 1}).findResource(); // GET /users/1.json

// Update an existing user
existingUser.set('name', 'Jeremy');
existingUser.saveResource(); // PUT /users/1.json

// Destroy an existing user
existingUser.destroy(); // DELETE /users/1.json

Take a look at Ember-REST on GitHub

Conclusion

Although Ember Data is currently only being recommended to those who are comfortable with the cutting edge, these libraries provide viable alternatives. I haven’t gone into much detail save for the basics, but each offers a unique (though similar) approach and a variety of different features which merit further investigation. ■