我意识到计算或手动订阅的目的是跟踪对可观察量的更改。但是,我遇到一种情况,我需要手动订阅才能在声明后立即运行,而不是等待observable更改。
有没有办法告诉订阅立即运行一次?
示例:
vm.foo = ko.observable("bar");
vm.foo.subscribe(function() {
// code i want to run immediately, and on every observable change
});
AFAIK,订阅只会在vm.foo
发生变化时运行,但我需要在应用启动后立即针对它运行代码。
答案 0 :(得分:3)
您可以使用valueHasMutated
上的函数observable
通知所有订阅者可观察的更改:
var vm = {};
vm.foo = ko.observable("bar");
vm.foo.subscribe(function() {
console.log('runs!');
});
ko.applyBindings(vm);
vm.foo.valueHasMutated(); // you see 'runs!' printed in console output
这是jsFiddle
答案 1 :(得分:0)
我建议您创建自己的" subscribeAndRun'方法非常有用,不会因使用valueHasMutated()通知任何和所有订阅者而导致意外的副作用和性能问题。
打字稿:
function subcribeAndRun<T>(o: KnockoutObservable<T>,callback: (v: T) => void): KnockoutObservable<T> {
o.subscribe(callback);
callback(o());
return o;
}
JavaScript:
function subcribeAndRun(o, callback) {
o.subscribe(callback);
callback(o());
return o;
}