viewModelの変数(subBarから直接関数)にアクセスすることはできません。
このようにviewModelを定義する場合:
function vm() {
var self = this;
this.subBars = ko.observableArray ([
new subBar(initialWidth01, color01);
new subBar(initialWidth02, color02);
]);
this.subBarsTotal = ko.computed(function(){...});
...
}
var viewModel = new vm();
そのプロパティを呼び出すことができます:
function subBar (initialWidth, color) {
self.initialWidth = initialWidth;
self.width = ok.computed(function(){
var adjustedWidth = self.initialWidth() / viewModel.subBarsTotal() * widthOfBar;
return adjustedWidth;
}
self.color = color;
}
または、次のようにviewModelのインスタンスをsubBarに渡すことができます。
function vm() {
var self = this;
this.subBars = ko.observableArray ([
new subBar(initialWidth01, color01, self);
new subBar(initialWidth02, color02, self);
]);
}
function subBar (initialWidth, color , vm) {
...
vm.subBarsTotal();
...
}
編集 :
コードを少し変更しました。定義された計算関数の後に配列値をプッシュしました。
このJsFiddleリンクを確認してください
function hundred_bar_section(width, color, dvm) {
this.hundred_width = ko.observable(width);
this.section_color = color;
console.log(dvm.hundred_bar_total()); // is now defined
}
function DashboardViewModel() {
var self = this;
this.hundred_bar_sections = ko.observableArray([]);
// adds the total current values of all hundred_bar_section widths
this.hundred_bar_total = ko.computed(function() {
var hundred_bar_length = self.hundred_bar_sections().length;
//console.log (hundred_bar_length);
var hundred_bar_added = 0;
for (var i = 0; i < hundred_bar_length; i++) {
hundred_bar_added += self.hundred_bar_sections()[i].hundred_width();
}
console.log(hundred_bar_added);
return hundred_bar_added;
});
this.hundred_bar_sections.push(new hundred_bar_section(100, "#f60", self));
this.hundred_bar_sections.push(new hundred_bar_section(200, "#6f0", self));
this.hundred_bar_sections.push(new hundred_bar_section(100, "#06f", self));
}
$(document).ready(function() {
var vm = new DashboardViewModel();
ko.applyBindings(vm);
})