2014-01-14 22 views
0

我有一個ko.computed功能和subscribe功能:Jquery的淘汰賽認購不叫第一次

後才computed功能已經由用戶觸發的訂閱功能被調用,而不是第一次也:

JsFiddle演示

的Javascript:

var viewModel = { 
    isChecked: ko.observable(false) 
}; 
viewModel.isValid = ko.computed(function(){ 
    console.log("calling isValid"); 
    return this.isChecked(); 
}, viewModel); 
viewModel.isValid.subscribe(function(value) { 
    console.log("isValid changed"); 
}); 
ko.applyBindings(viewModel); 

HTM l

<input type="checkbox" id="checkbox" data-bind="checked: isChecked" /> 
<label for="checkbox">Checkbox</label> 

我該如何「觸發」init的訂閱功能呢?

+0

你爲什麼訂閱'computed'而不是'observable'?根據定義,只有在明確調用計算時纔會「更改」 – CodingIntrigue

+0

因爲'isValid'通常使用更多的可觀察量,而不僅僅是一個。我爲了簡單起見就這樣做了 – Catalin

+0

計算和訂閱僅當值不改變初始化時觸發。你試圖通過啓動init來實現什麼? – Tanner

回答

0

您應該訂閱您所有的觀測值來代替:

var viewModel = { 
    isChecked1: ko.observable(false), 
    isChecked2: ko.observable(false), 
    isChecked3: ko.observable(false) 
}; 
viewModel.isValid = ko.computed(function() { 
    return viewModel.isChecked1() && viewModel.isChecked2() && viewModel.isChecked3(); 
}); 
viewModel.isChecked1.subscribe(validChange); 
viewModel.isChecked2.subscribe(validChange); 
viewModel.isChecked3.subscribe(validChange); 

function validChange() { 
    console.log("isValid Changed to: " + viewModel.isValid()); 
}; 
1

你總是可以離開isChecked觀察到的空當初始化和更新它的值訂閱被宣佈後,就像這樣:

var viewModel = { 
    isChecked: ko.observable() 
}; 
viewModel.isValid = ko.computed(function(){ 
    console.log("calling isValid"); 
    return this.isChecked(); 
}, viewModel); 
viewModel.isValid.subscribe(function(value) { 
    console.log("isValid changed"); 
}); 

// set default value here to fire subscription code 
viewModel.isChecked(false); 

ko.applyBindings(viewModel); 

updated fiddle

不知道這是否是一個問題,但是這也會在init上調用你的計算函數。