I donโt quite understand if you want to have a view for the Collection of Models or do you want the view to concern one Model ?
If this view is for one model,
then you can stick to one look. Just listen to some events that enable you to enable or disable editing features. (You can do this even by setting contenteditable = "true" to dom elements)
I highly recommend using some tools like backbone.marionette or chaplinjs. They will save you a ton of time.
The following are examples for Backbone.Marionette
template example
<script type="text/template" id="contact-view-template"> <span data-bind="firstName"></span> <span data-bind="lastName"></span> <span data-bind="email"></span> <a href="#" data-action="edit"> <a href="#" data-action="save" style="display:none"> </script>
View Code:
ContactView = Marionette.ItemView.extend({ template:"#contact-view-template", events:{ "click [data-action=edit]":"edit", "click [data-action=save]":"save" }, edit:function(){ this.$("[data-action=edit]").hide(); this.$("[data-action=save]").show(); this.$("[data-bind]").attr("contenteditable",true); }, save:function(){ var value = {}; _.each(this.$("[data-bind]",function(el){ value[el.dataset['bind']]= $(el).val() || $(el).text(); })); this.model.set(value);
If you want to have several views, and not just:
ContactListEditView = Marionette.CompositeView.extend({ itemView:ContactView.extend({ tagName:"li" }), itemViewContainer:"ul", template:_.template("<h1>ContactList</h1><p>feel free to edit</p><ul></ul>") });
If you need 1 type of editing and several non-editable types
(I hope I have not made serious mistakes):
ContactEditView = Marionette.ItemView.extend({ template:"#contact-edit-view", // your template & bindings events:{ "click [data-action=save]":"save" }, save:function(){ var value = {}; _.each(this.$("[data-bind]",function(el){ value[el.dataset['bind']]= $(el).val() || $(el).text(); })); this.model.set(value); this.model.save(); } }); ContactListView = Marionette.CompositeView.extend({ itemView:Marionette.ItemView.extend({ template:"#contact-view-template", events:{ "click [data-action=edit]":"edit" }, edit:function(){ this.trigger("edit",this); } }), regions:{ "edit":"[data-region=edit]" }, initialize:function(){ this.on("itemview:edit",function(view){ this.edit.show(new ContactEditView({model:view.model})); }.bind(this)); } });