在Knockout中调用声明的手动订阅?

时间:2015-12-15 05:20:24

标签: knockout.js observable

我意识到计算或手动订阅的目的是跟踪对可观察量的更改。但是,我遇到一种情况,我需要手动订阅才能在声明后立即运行,而不是等待observable更改。

有没有办法告诉订阅立即运行一次?

示例:

vm.foo = ko.observable("bar");
vm.foo.subscribe(function() {
    // code i want to run immediately, and on every observable change
});

AFAIK,订阅只会在vm.foo发生变化时运行,但我需要在应用启动后立即针对它运行代码。

2 个答案:

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