在 knockout 中,您可以执行以下操作:
myObservable.subscribe(function(newValue){ doSomething(); });
现在,如果我有多个可观察对象,我想订阅,我可以这样做:
myObservable1.subscribe(function(){ doSomething(); });
myObservable2.subscribe(function(){ doSomething(); });
但是,当我有大量订阅时,这可能会有点难看,而且如果您当前想限制更新机制,则必须针对每个订阅执行此操作。
那么我有没有办法以某种方式将它们全部包装起来?即
ko.subscribeToMany(myObservable1, myObservable2)
. throttle (500)
.subscribe(function(){ doSomething() });
我有一个场景,我基本上想根据更改刷新图表,并且它相当耗费资源,所以我希望不必订阅每个动态数据位,我可以将它们整理成单个计算样式订阅,然后从那里限制该单个订阅,因为其他订阅可能希望立即收到通知,而无需延迟/限制。
那么上述情况可以通过 knockout 实现吗?
最佳答案
快速实现如下:
ko.obsgroup = function() {
var groupManager = {};
var observables = [];
var throttle = 0;
var throttleTimeout;
for(var i = 0; i < arguments.length; i++) {
observables.push(arguments[i]);
}
groupManager.throttle = function(duration) {
throttle = duration;
return groupManager;
};
groupManager.subscribe = function(handler) {
function throttledHandler(val) {
if(throttle > 0) {
if(!throttleTimeout) {
throttleTimeout = setTimeout(function() {
throttleTimeout = undefined;
handler(val);
}, throttle);
}
} else {
handler(val);
}
}
for(var i = 0; i < arguments.length; i++) {
observables[i].subscribe(throttledHandler);
}
return groupManager;
};
return groupManager;
};
用法:
var vm = {
v1: ko.observable(0),
v2: ko.observable(0),
v3: ko.observable(0),
log: ko.observable(0)
};
ko.obsgroup(vm.v1, vm.v2, vm.v3)
.throttle(1000)
.subscribe(function(val) {
vm.log('changed: ' + Date.now());
});
ko.applyBindings(vm);
#
演示:JSFiddle
关于javascript - 将多个 knockout 订阅整理到单个通知中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27273587/