New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Backbone.Marionette implementations #284
Changes from all commits
4a049b5
83d113a
1c358f5
cfe8ab3
6cd7d71
645fad0
fa83d01
b3d3585
3ed88ab
bfe4245
143d125
0c5c4bb
b65e95c
e01a24f
a9e35c4
e7329df
60dcb8b
1ae2706
e051bdc
3e81e5b
0fa7cb6
e6f66f5
8b0413a
47df8a5
726803b
f8ee8af
98e27f0
682b13c
328cf6a
50066ee
b2bc129
2ef2482
9feda9c
52db7d4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
js/lib/underscore.js | ||
js/lib/backbone.js | ||
js/lib/backbone.marionette.js | ||
js/lib/backbone-localStorage.js |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#todoapp.filter-active #todo-list .completed { | ||
display:none | ||
} | ||
#todoapp.filter-completed #todo-list .active { | ||
display:none | ||
} | ||
|
||
#main, #footer { | ||
display : none; | ||
} | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
<!doctype html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="utf-8"> | ||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> | ||
<title>Marionette • TodoMVC</title> | ||
<link rel="stylesheet" href="../../../assets/base.css"> | ||
<link rel="stylesheet" href="css/custom.css"> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should be called app.css |
||
<!--[if IE]> | ||
<script src="../../../assets/ie.js"></script> | ||
<![endif]--> | ||
</head> | ||
<body> | ||
<section id="todoapp"> | ||
<header id="header"></header> | ||
<section id="main"></section> | ||
<footer id="footer"></footer> | ||
</section> | ||
<footer id="info"> | ||
<p>Double-click to edit a todo</p> | ||
|
||
<p>Created by <a href="http://github.com/jsoverson">Jarrod Overson</a></p> | ||
</footer> | ||
|
||
<!-- vendor libraries --> | ||
<script src="../../../assets/base.js"></script> | ||
<script src="../../../assets/jquery.min.js"></script> | ||
<script src="js/lib/underscore.js"></script> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use lodash in the asset folder |
||
<script src="js/lib/backbone.js"></script> | ||
<script src="js/lib/backbone-localStorage.js"></script> | ||
<script src="js/lib/backbone.marionette.js"></script> | ||
|
||
<!-- application libraries --> | ||
<script src="js/models/Todo.js"></script> | ||
<script src="js/collections/TodoList.js"></script> | ||
<script src="js/Router.js"></script> | ||
|
||
<!-- application views --> | ||
<script src="js/views/Footer.js"></script> | ||
<script src="js/views/Header.js"></script> | ||
<script src="js/views/TodoItemView.js"></script> | ||
<script src="js/views/TodoListCompositeView.js"></script> | ||
|
||
<!-- application --> | ||
<script src="js/app.js"></script> | ||
|
||
<script type="text/html" id="template-footer"> | ||
<span id="todo-count"><strong></strong> items left</span> | ||
<ul id="filters"> | ||
<li> | ||
<a href="#/">All</a> | ||
</li> | ||
<li> | ||
<a href="#/active">Active</a> | ||
</li> | ||
<li> | ||
<a href="#/completed">Completed</a> | ||
</li> | ||
</ul> | ||
<button id="clear-completed">Clear completed</button> | ||
</script> | ||
|
||
<script type="text/html" id="template-header"> | ||
<h1>todos</h1> | ||
<input id="new-todo" placeholder="What needs to be done?" autofocus> | ||
</script> | ||
|
||
<script type="text/html" id="template-todoItemView"> | ||
<div class="view"> | ||
<input class="toggle" type="checkbox" <% if (completed) { %>checked<% } %>> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
<label><%= title %></label> | ||
<button class="destroy"></button> | ||
</div> | ||
<input class="edit" value="<%= title %>"> | ||
</script> | ||
|
||
<script type="text/html" id="template-todoListCompositeView"> | ||
<input id="toggle-all" type="checkbox"> | ||
<label for="toggle-all">Mark all as complete</label> | ||
<ul id="todo-list"></ul> | ||
</script> | ||
|
||
<script> | ||
var _gaq = _gaq || []; | ||
_gaq.push(['_setAccount', 'UA-22728809-1']); | ||
_gaq.push(['_trackPageview']); | ||
(function () { | ||
var ga = document.createElement('script'); | ||
ga.type = 'text/javascript'; | ||
ga.async = true; | ||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||
var s = document.getElementsByTagName('script')[0]; | ||
s.parentNode.insertBefore(ga, s); | ||
})(); | ||
</script> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove ^ |
||
</body> | ||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
|
||
var Router = Backbone.Marionette.AppRouter.extend({ | ||
appRoutes : { | ||
'*filter': 'setFilter' | ||
}, | ||
controller : { | ||
setFilter : function(param) { | ||
app.vent.trigger('todoList:filter', param.trim() || ''); | ||
} | ||
} | ||
}); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
/*global $*/ | ||
|
||
var todoList = new TodoList(); | ||
|
||
var app = new Backbone.Marionette.Application(); | ||
|
||
app.bindTo(todoList, 'all', function () { | ||
if (todoList.length === 0) { | ||
app.main.$el.hide(); | ||
app.footer.$el.hide(); | ||
} else { | ||
app.main.$el.show(); | ||
app.footer.$el.show(); | ||
} | ||
}); | ||
|
||
app.addRegions({ | ||
header : '#header', | ||
main : '#main', | ||
footer : '#footer' | ||
}); | ||
|
||
app.addInitializer(function(){ | ||
app.header.show(new Header()); | ||
app.main.show(new TodoListCompositeView({ | ||
collection : todoList | ||
})); | ||
app.footer.show(new Footer()); | ||
|
||
todoList.fetch(); | ||
}); | ||
|
||
|
||
app.vent.on('todoList:filter',function(filter) { | ||
filter = filter || 'all'; | ||
$('#todoapp').attr('class', 'filter-' + filter); | ||
}); | ||
|
||
$(function(){ | ||
app.start(); | ||
new Router(); | ||
Backbone.history.start(); | ||
}); | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
|
||
var TodoList = (function(){ | ||
function isCompleted(todo) { return todo.get('completed'); } | ||
|
||
return Backbone.Collection.extend({ | ||
model: Todo, | ||
localStorage: new Backbone.LocalStorage('todos-backbone'), | ||
|
||
getCompleted: function() { | ||
return this.filter(isCompleted); | ||
}, | ||
getActive: function() { | ||
return this.reject(isCompleted); | ||
}, | ||
comparator: function( todo ) { | ||
return todo.get('created'); | ||
} | ||
}); | ||
}()); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
/** | ||
* Backbone localStorage Adapter | ||
* https://github.com/jeromegn/Backbone.localStorage | ||
*/ | ||
|
||
(function() { | ||
// A simple module to replace `Backbone.sync` with *localStorage*-based | ||
// persistence. Models are given GUIDS, and saved into a JSON object. Simple | ||
// as that. | ||
|
||
// Hold reference to Underscore.js and Backbone.js in the closure in order | ||
// to make things work even if they are removed from the global namespace | ||
var _ = this._; | ||
var Backbone = this.Backbone; | ||
|
||
// Generate four random hex digits. | ||
function S4() { | ||
return (((1+Math.random())*0x10000)|0).toString(16).substring(1); | ||
}; | ||
|
||
// Generate a pseudo-GUID by concatenating random hexadecimal. | ||
function guid() { | ||
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4()); | ||
}; | ||
|
||
// Our Store is represented by a single JS object in *localStorage*. Create it | ||
// with a meaningful name, like the name you'd give a table. | ||
// window.Store is deprectated, use Backbone.LocalStorage instead | ||
Backbone.LocalStorage = window.Store = function(name) { | ||
this.name = name; | ||
var store = this.localStorage().getItem(this.name); | ||
this.records = (store && store.split(",")) || []; | ||
}; | ||
|
||
_.extend(Backbone.LocalStorage.prototype, { | ||
|
||
// Save the current state of the **Store** to *localStorage*. | ||
save: function() { | ||
this.localStorage().setItem(this.name, this.records.join(",")); | ||
}, | ||
|
||
// Add a model, giving it a (hopefully)-unique GUID, if it doesn't already | ||
// have an id of it's own. | ||
create: function(model) { | ||
if (!model.id) { | ||
model.id = guid(); | ||
model.set(model.idAttribute, model.id); | ||
} | ||
this.localStorage().setItem(this.name+"-"+model.id, JSON.stringify(model)); | ||
this.records.push(model.id.toString()); | ||
this.save(); | ||
return model.toJSON(); | ||
}, | ||
|
||
// Update a model by replacing its copy in `this.data`. | ||
update: function(model) { | ||
this.localStorage().setItem(this.name+"-"+model.id, JSON.stringify(model)); | ||
if (!_.include(this.records, model.id.toString())) this.records.push(model.id.toString()); this.save(); | ||
return model.toJSON(); | ||
}, | ||
|
||
// Retrieve a model from `this.data` by id. | ||
find: function(model) { | ||
return JSON.parse(this.localStorage().getItem(this.name+"-"+model.id)); | ||
}, | ||
|
||
// Return the array of all models currently in storage. | ||
findAll: function() { | ||
return _(this.records).chain() | ||
.map(function(id){return JSON.parse(this.localStorage().getItem(this.name+"-"+id));}, this) | ||
.compact() | ||
.value(); | ||
}, | ||
|
||
// Delete a model from `this.data`, returning it. | ||
destroy: function(model) { | ||
this.localStorage().removeItem(this.name+"-"+model.id); | ||
this.records = _.reject(this.records, function(record_id){return record_id == model.id.toString();}); | ||
this.save(); | ||
return model; | ||
}, | ||
|
||
localStorage: function() { | ||
return localStorage; | ||
} | ||
|
||
}); | ||
|
||
// localSync delegate to the model or collection's | ||
// *localStorage* property, which should be an instance of `Store`. | ||
// window.Store.sync and Backbone.localSync is deprectated, use Backbone.LocalStorage.sync instead | ||
Backbone.LocalStorage.sync = window.Store.sync = Backbone.localSync = function(method, model, options, error) { | ||
var store = model.localStorage || model.collection.localStorage; | ||
|
||
// Backwards compatibility with Backbone <= 0.3.3 | ||
if (typeof options == 'function') { | ||
options = { | ||
success: options, | ||
error: error | ||
}; | ||
} | ||
|
||
var resp; | ||
|
||
switch (method) { | ||
case "read": resp = model.id != undefined ? store.find(model) : store.findAll(); break; | ||
case "create": resp = store.create(model); break; | ||
case "update": resp = store.update(model); break; | ||
case "delete": resp = store.destroy(model); break; | ||
} | ||
|
||
if (resp) { | ||
options.success(resp); | ||
} else { | ||
options.error("Record not found"); | ||
} | ||
}; | ||
|
||
Backbone.ajaxSync = Backbone.sync; | ||
|
||
Backbone.getSyncMethod = function(model) { | ||
if(model.localStorage || (model.collection && model.collection.localStorage)) | ||
{ | ||
return Backbone.localSync; | ||
} | ||
|
||
return Backbone.ajaxSync; | ||
}; | ||
|
||
// Override 'Backbone.sync' to default to localSync, | ||
// the original 'Backbone.sync' is still available in 'Backbone.ajaxSync' | ||
Backbone.sync = function(method, model, options, error) { | ||
return Backbone.getSyncMethod(model).apply(this, [method, model, options, error]); | ||
}; | ||
|
||
})(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Space between each rule. Space after
:
, not in front.