好的,我想出了一种方法来做我想做的事。请参阅下面的代码。有没有更好的办法?
const store = Rx.Observable.create(function(observer) {
let state = { commands: [
{key: 'arrows', isEnabled: true, activeState: 0, numStates: 2 },
{key: 'focus', isEnabled: false, hotKey: 'f' },
{key: 'geometry', isEnabled: true, activeState: 1, numStates: 2 },
{key: 'goToEnd', isEnabled: true }]
};
observer.next(state);
state = { commands: [
{key: 'arrows', isEnabled: true, activeState: 1, numStates: 2 },
{key: 'focus', isEnabled: true, hotKey: 'f' },
{key: 'geometry', isEnabled: true, activeState: 1, numStates: 2 },
{key: 'goToEnd', isEnabled: true }]
};
observer.next(state);
state = { commands: [
{key: 'arrows', isEnabled: true, activeState: 1, numStates: 2 },
{key: 'focus', isEnabled: true, hotKey: 'f' },
{key: 'geometry', isEnabled: true, activeState: 1, numStates: 2 },
{key: 'goToEnd', isEnabled: true }]
};
observer.next(state);
});
const subscribe = store.map( state => {
const commands = state.commands.filter( cmd => cmd.key === 'arrows' );
if( commands.length == 0 ) {
return undefined;
}
const result = {
isEnabled: commands[0].isEnabled,
activeState: commands[0].activeState,
};
return result;
})
.distinctUntilChanged( ( a, b ) => a.isEnabled === b.isEnabled && a.activeState === b.activeState )
.subscribe(val => console.log(val));
此处的工作示例:http://jsbin.com/xipaqusivi/1/edit?js,console
基本上我只在 isEnabled 或 activeState 属性更改为指定的选定命令键(本示例中的箭头)时收到通知