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

Calling manual subscription on declaration in Knockout?

我意识到计算或手动订阅的要点是跟踪对可观察对象的更改。但是,我 运行 遇到了这样一种情况,即我需要在 运行 声明后立即对其进行手动订阅,而不是等待 observable 发生变化。

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

示例:

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

A​​FAIK,如果 vm.foo 更改,订阅将仅 运行,但我有代码,我需要在应用程序启动后立即 运行 反对它。

您可以在 observable 上使用函数 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

我建议创建您自己的 'subscribeAndRun' 方法,该方法非常有用,不会因使用 valueHasMutated() 通知所有订阅者而导致意外 side-effects 和性能问题。

打字稿:

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