I am trying to get this to work but am not doing something right. I am using knockout, taking a json response and mapping it for a checkout cart, what I am not able to do is add a function after to add the sum of the product prices. see below for an idea of what I am trying to do,
full fiddle is here.. http://jsfiddle.net/justayles/Jeaua/26/
var jsonCart = {
"globalshipping": 1.00,
"globaltax": 5.00,
"productitem": [
{
"img": '/Content/img/notavailable.jpg',
"produrl": 'http://www.google.com',
"prodtitle": 'Product1',
"opt1": 'colour',
"opt2": 'size',
"qty": 3,
"unitprice": 10.00,
"shippingcost": 0.00,
"like": true,
"likediscount": 10,
"taxable": true
},
{
"img": '/Content/img/notavailable.jpg',
"produrl": 'http://www.google.com',
"prodtitle": 'Product1',
"opt1": 'colour',
"opt2": 'size',
"qty": 1,
"unitprice": 33.00,
"shippingcost": 0.00,
"like": false,
"likediscount": 0,
"taxable": false
},
{
"img": '/Content/img/notavailable.jpg',
"produrl": 'http://www.yahoo.com',
"prodtitle": 'Product1',
"opt1": 'colour',
"opt2": 'size',
"qty": 5,
"unitprice": 21.00,
"shippingcost": 0.00,
"like": true,
"likediscount": 10,
"taxable": true
}
]
};
var mappingOptions = {
'productitem': {
// overriding the default creation / initialization code
create: function (options) {
return (new (function () {
// setup the computed binding
this.calcPrice = ko.computed(function () {
return this.unitprice() * this.qty();
}, this);
ko.mapping.fromJS(options.data, {}, this);
})(/* call the ctor here */));
}
}
};
var viewModel = ko.mapping.fromJS(jsonCart, mappingOptions );
viewModel.grandTotal = ko.computed(function() {
var result = 0;
ko.utils.arrayForEach(this.productitem, function(item) {
result += item.calcPrice;
});
return result;
}, viewModel);
console.log(viewModel);
ko.applyBindings(viewModel);
Fixed: http://jsfiddle.net/Jeaua/27/
You forgot parentheses on your productitem and calcPrice observables. Remember, ko.mapping turns arrays into observable arrays and values into observable values. These need to be called as functions in order to retrieve their actual value.
viewModel.grandTotal = ko.computed(function() {
var result = 0;
ko.utils.arrayForEach(this.productitem() /* parentheses */, function(item) {
result += item.calcPrice(); /* parentheses */
});
return result;
}, viewModel);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With