Jquery Knockout подписывается не в первый раз

122
21

У меня есть функция ko.computed и функция subscribe:

Функция подписки вызывается только после того, как пользователь 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);

Html

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

Как я могу "запустить" функцию подписки на init?

спросил(а) 2014-01-14T17:02:00+04:00 6 лет, 8 месяцев назад
1
Решение
56

Вы всегда можете оставить 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);

См. Обновленный скрипт.

Не уверен, что это проблема, но это вызовет вашу вычисленную функцию также в init.

ответил(а) 2014-01-14T17:28:00+04:00 6 лет, 8 месяцев назад
42

Вместо этого вы должны подписаться на все ваши наблюдаемые:

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

ответил(а) 2014-01-14T17:11:00+04:00 6 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема