Use MarionetteJS to simplify solution
<html>
<head>
<style>
table {
border: 1px solid black;
border-collapse: collapse;
}
table td {
width: 60px;
border: 1px solid black;
}
table tr {
border: 1px solid black;
}
</style>
</head>
<body>
<script id="table-row-template" type="text/template">
<td>
<div>
<%= name %><br>
<%= price %>
</div>
</td>
</script>
</script>
<div id="tableid">
</div>
<br>
<p>Total: <span id="totalPrice"></span></p>
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="http://jashkenas.github.io/underscore/underscore-min.js"></script>
<script src="http://jashkenas.github.io/backbone/backbone-min.js"></script>
<script src="http://marionettejs.com/downloads/backbone.marionette.min.js"></script>
<script>
$(function() {
var storeItemModel = Backbone.Model.extend({
default: {
name: "default",
price: 0.0,
isSelected: false
}
});
var storeItemView = Backbone.Marionette.ItemView.extend({
tagName: 'tr',
modelEvents: {
'change': 'modelChanged'
},
template: "#table-row-template",
events: {
'mouseenter': 'mouseEntered',
'mouseleave': 'mouseleft',
'click': 'clicked'
},
ui: {
div: "div"
},
onRender: function(){
if(this.model.get("isSelected") == true) {
this.ui.div.css("background-color", "33CC99");
}
},
modelChanged: function() {
this.render();
this.trigger('calculateTotalPrice');
},
mouseEntered: function() {
if(this.model.get("isSelected") == false)
this.ui.div.css("background-color", "ACC4E6");
},
mouseleft: function() {
if(this.model.get("isSelected") == false)
this.ui.div.css("background-color", "white");
},
clicked: function(e) {
//prevent the default click behavior
e.preventDefault();
var isSelected = this.model.get("isSelected");
isSelected = this.model.get("isSelected") === false ? true : false;
this.model.set("isSelected", isSelected);
}
});
var storeItemCollection = Backbone.Collection.extend({
model: storeItemModel
});
var listOfStoreItems = new storeItemCollection([
new storeItemModel({
name: "towels",
price: 10.99,
isSelected: false
}),
new storeItemModel({
name: "toys",
price: 7.99,
isSelected: false
})
]);
var AppView = Marionette.CollectionView.extend({
initialize: function () {
this.updatePrice();
},
tagName:'table',
childView: storeItemView,
onRender: function(){
$("#tableid").append(this.el);
},
modelEvents: {
'change': 'updatePrice'
},
updatePrice: function () {
var totalPrice = this.model.get("totalPrice");
$("#totalPrice").html(totalPrice);
},
childEvents: {
calculateTotalPrice: function() {
var totalPrice = 0;
listOfStoreItems.each(function(model){
var isSelected = model.get("isSelected");
if(isSelected === true)
totalPrice += model.get("price");
}, this);
this.model.set("totalPrice", totalPrice);
}
}
});
var AppModel = Backbone.Model.extend({
default: {
totalPrice: 0
}
});
var App = new AppView({
collection: listOfStoreItems,
model: new AppModel({totalPrice: 0})
});
App.render();
});
</script>
</body>
</html>