Jquery Knockout订阅没有第一次调用

时间:2014-01-14 14:02:26

标签: javascript jquery knockout.js

我有一个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上“触发”订阅功能?

2 个答案:

答案 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());
};