On Github r-medina / beyond_backbone
by: Ricky Medina
from their website:
“… [it] gives structure to web applications by providing models with key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing API over a RESTful JSON interface.”
var app = {}; // model app.Todo = Backbone.Model.extend({ urlRoot: '/todo', defaults: {title: '', completed: false} }); // collection app.TodoList = Backbone.Collection.extend({ model: app.Todo, url: '/todo', remaining: function() { return this.filter(function(todo) { // built-in underscorejs functions return !todo.get('completed'); }); }, }); app.todoList = new app.TodoList(); // view app.AppView = Backbone.View.extend({ el: 'ul#todo-list', initialize: function() { var _this = this; this.model.fetch({ success: function(todos) { // make list of remaining things to do todos.remaining().map(function(todo) { _this.$el.append('' + todo.title + ''); }; )} }); }; }); app.view = new app.AppView(model: app.todoList);
becomes hard to maintain and develop—especially if anything changes on the back-end
solves two problems:
schema: { title : {required: true}, completed : {required: true} }perl
use constant FIELDS => { id => { numeric => 1, required => 0 }, title => { numeric => 0, required => 1 }, completed => { numeric => 0, required => 0 } };
brainy will create a RESTful API with various HTTP endpoints based on backbone models and collections!
var Todo = Backbone.Model.extend({ idAttribute: '_id', urlRoot: '/todo' }); var TodoList = Backbone.Collection.extend({ url: '/todo', model: Todo });
$ curl -X POST -d 'title=discover%20andy's%20weakness' /todo { "title" : "discover andy's weakness", "completed" : "false", "_id" : "512a40f1163dcb4bce000001" } $ curl -X GET /todo [{ "title" : "discover andy's weakness", "completed" : "false", "_id" : "512a40f1163dcb4bce000001" }]
$ npm install brainy-server -g $ git clone git@github.com:brainyio/brainy-boilerplate.git $ cd brainy-boilerplate/src $ brainy-server
a “basic Rendr app looks like a hybrid between a standard client-side MVC Backbone.js app and an Express app, with a little Rails convention thrown in.”
| app |-- collections |-- controllers |-- helpers |-- models |-- templates |-- views
accomplishes a few things
data-binding: all properties of the view are accessible to the template
var view = new Thorax.View({ greeting: 'Hello', template: Handlebars.compile('{{greeting}} World!') }); view.appendTo('body');
actually allows for child views
var parent = new Thorax.View({ child: new Thorax.View(...), template: Handlebars.compile('{{view child}}') });