Comments Models, Collection, View
The comments model is a very simple Backbone, with the addition of validation.
var CommentModel = Backbone.Model.extend({
validate: function(attrs){
if( !attrs.email ){
return 'Email address is required';
}
if( !attrs.content ){
return 'You have to say something in your comment';
}
}
});
So now if somewhere in our code, we want to create a new comment based on the CommentModel:var model = new CommentModel();
It would error out, because it doesn't pass the validation (no email and no content).
Then he creates the collection, based on the CommentModel. Thus it will use the validation we added to CommentModel. This is a common pattern for writing Backbone apps.
var CommentModel = ...
var CommentsCollection = Backbone.Collection.extend({
// set it to use CommentModel
// with our custom validate method
model: CommentModel
});
This is the basic start in almost all Backbone apps.Next up is the html template. This is for demonstration only, normally you would split it up into multiple lines and multiple files.
var CommentModel = ...
var CommentsCollection = Backbone.Collection.extend({
model: CommentModel
});
var commentTemplate = _.template('<header>Posted by <span class="author-email"><a href=""><%= model.get("email") %></a></span> <span class="date"><%= model.get("created_at") %></span></header><div class="comment-content"><%= renderMarkdown() %></div>');
It's a function, that when passed in an object returns an html string with that object.This example uses underscore, but you of course you can use any kind of templating engine you want.
The individual comments
Each comment will be rendered as a list item, with a header element in it and the comment content.
You can use markdown for the comments.
Explains this view element.
Uses
Backbone.View.extend({})
.
var CommentModel = ...
var CommentsCollection = Backbone.Collection.extend({...});
var commentTemplate = _.template('...');
var CommentView = Backbone.View.extend({
tagName: 'li',
template: commentTemplate,
initialize: function(){
if( !this.model ){
throw new Error('You must provide a Comment model');
}
this.listenTo( this.model, 'remove', this.remove);
},
render: function(){
this.$el.html( this.template( this ) );
return this.$el;
},
renderMarkdown: function(){
return markdown.toHTML( this.model.get('content') );
}
});
You define custom properties. tagName
: First istagName
. Every Backbone view is rooted in the DOM. So it will create a new DOM element and will attach to a DOM element.template
: our commentTemplate we defined earlier. We can later reference it bythis.template
initialize
: if there's no model defined, throw an error. It needs a model. Enforcing some basic rulesthis.listenTo
: (in initialise) attach an event handler. The remove event will happen on thethis.model
objectrender
: our custom render method. We have to define it on our view. We're using jQuery here (this.$el.html(...)
)renderMarkdown
: using a third-party library (markdown.js). Fetches the model and renders it.