Computed observables are evaluated immediately during creation. In your case, appViewModel
has not been created yet and this
will not represent the appViewModel
.
There are many ways to ensure that this
is correct in this case. Here are two:
-
Create it outside of your initial object literal:
var appViewModel = { features: ko.observableArray([ new objFeatures("Feature1", 20), new objFeatures("Feature2", 20) ]) }; appViewModel.grandTotal = ko.computed(function() { var total = 0; ko.utils.arrayForEach(this.features(), function(feature) { total += feature.price(); }); return total; }, appViewModel);
-
Create your view model in a function:
var AppViewModel = function() { this.features = ko.observableArray([ new objFeatures("Feature1", 20), new objFeatures("Feature2", 20) ]); this.grandTotal = ko.computed(function() { var total = 0; ko.utils.arrayForEach(this.features(), function(feature) { total += feature.price(); }); return total; }, this); }; ko.applyBindings(new AppViewModel());