我正在使用在knockout.js中构建的模块,我希望按照RxJs,highland.js或bacon.js的方式将更改映射到事件流。 / p>
我知道有很多方法可以通过延长淘汰赛来实现这一目标,例如ko.subscribable.fn.someFilter
。但这假设我想要淘汰赛为我做我的工作 - 我不是,特别是。
通常在培根或高地你会看到类似的东西:
//bacon
var strm1 = $('#el').toEventStream('click');
strm1.map(transformFn);
//highland
var strm2 = _('click',$('#el'));
strm2.map(transformFn);
不幸的是,在淘汰赛中我无法找到一种简单的方法来挂钩事件,因为knockout实现了pub / sub而不是发射器。有关我如何依赖的任何见解?
我在考虑类似于调解器发射器,它订阅所有可观察的属性,然后发出事件。
假设我有一个像ko viewmodel绑定的东西:
<input data-bind="value:name" />
并且viewmodel类似于
function Person(){
this.name = ko.observable('Bob');
this.age = ko.observable(21);
//...
};
var person = new Person();
var emitter = Emitter({});
var streams = {};
然后我映射如下,其中_
是高地。
for(var key in person){
streams[key]=_(key+':changed',watcher);
person[key].subscribe(function(){
watcher.emit(key+':changed',arguments);
});
}
function streamHandler(){
console.log('streamHandler got',arguments);
}
一切都很好,我的发射器发射得很好,但是这没有做任何事情:
streams['name'].each(streamHandler);
所以,我错过了一些东西。怎么了?