在 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
});
AFAIK,如果 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;
}
我意识到计算或手动订阅的要点是跟踪对可观察对象的更改。但是,我 运行 遇到了这样一种情况,即我需要在 运行 声明后立即对其进行手动订阅,而不是等待 observable 发生变化。
有没有办法立即告诉订阅 运行 一次?
示例:
vm.foo = ko.observable("bar");
vm.foo.subscribe(function() {
// code i want to run immediately, and on every observable change
});
AFAIK,如果 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;
}