我有一个ko.computed
函数和一个subscribe
函数:
只有在用户触发computed
函数后才会调用subscribe函数,而不是第一次调用:
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);
HTML
<input type="checkbox" id="checkbox" data-bind="checked: isChecked" />
<label for="checkbox">Checkbox</label>
我如何在init上“触发”订阅功能?
答案 0 :(得分:1)
您可以在初始化时将isChecked
observable保留为空,并在声明订阅后更新它的值,如下所示:
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上调用您的计算函数。
答案 1 :(得分: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());
};