如何在具有redux可观察性的dom元素上添加事件侦听器
我需要帮助在窗口键控事件后发送操作如何在具有redux可观察性的dom元素上添加事件侦听器,redux,redux-observable,Redux,Redux Observable,我需要帮助在窗口键控事件后发送操作 () => Observable.fromEvent(window, 'keyup').map(event => ({type: 'KEY_PRESSED', key: event.key, event})); 谢谢你如果你总是想在这些keyup事件上监听和发送操作,Epic非常简单: const windowKeyUpEpic = () => Observable.fromEvent(window, 'keyup') .map
() => Observable.fromEvent(window, 'keyup').map(event => ({type: 'KEY_PRESSED', key: event.key, event}));
谢谢你如果你总是想在这些
keyup
事件上监听和发送操作,Epic非常简单:
const windowKeyUpEpic = () =>
Observable.fromEvent(window, 'keyup')
.map(event => ({
type: 'KEY_UP',
key: event.key,
event
}));
但这可能是低效的,因为您可能只想在某些特定情况下倾听
相反,您可以通过某种方式启用/禁用此全局侦听器:
const windowKeyUpEpic = action$ =>
action$.ofType('START_LISTEN_FOR_KEYUP')
.switchMap(() =>
Observable.fromEvent(window, 'keyup')
.map(event => ({
type: 'KEY_UP',
key: event.key,
event
}))
.takeUntil(action$.ofType('STOP_LISTEN_FOR_KEYUP'))
);
如果您总是想在这些
keyup
事件上监听和调度操作,Epic非常简单:
const windowKeyUpEpic = () =>
Observable.fromEvent(window, 'keyup')
.map(event => ({
type: 'KEY_UP',
key: event.key,
event
}));
但这可能是低效的,因为您可能只想在某些特定情况下倾听
相反,您可以通过某种方式启用/禁用此全局侦听器:
const windowKeyUpEpic = action$ =>
action$.ofType('START_LISTEN_FOR_KEYUP')
.switchMap(() =>
Observable.fromEvent(window, 'keyup')
.map(event => ({
type: 'KEY_UP',
key: event.key,
event
}))
.takeUntil(action$.ofType('STOP_LISTEN_FOR_KEYUP'))
);
为什么不使用.switchMap(()=>Observable.fromEvent(…).map(…).takeUntil()?如果我们把map放在switchMap()内部,我担心放更多的switchMap()调用(例如承诺链)会导致太多嵌套。@NikhilAgarwal如果你把它们放在外部,您正在将这些运算符应用于顶级流—这意味着
takeUntil
将取消整个epic—您将不会侦听未来的操作,`map在本例中不会产生任何影响,但如果您使用catch
添加错误处理,它将--您不希望错误在开关映射
之外冒泡,否则错误将到达类型为的操作$,epic将终止。这有时被称为“隔离观察者链”,所以我们这样做是为了确保类型为
的action$不会终止。这是否意味着可以在第一个switchMap()中执行我上面建议的操作?例如:-action$of type(…).switchMap(()=>observeable.fromPromise(…).switchMap(()=>observeable.fromPromise(…).switchMap(…).map(…).takeUntil(…)
这意味着我只需要做一级嵌套来隔离观察者链。@NikhilAgarwal就其本质而言,我不能说嵌套一级总是解决方案,但在您的情况下,如果您所关心的不是将错误传播到顶层,那么是的!的确,在大多数可观察到的redux情况下,一级隔离通常是标准的,但并非总是且绝对不是所有RXJ的情况。希望这有帮助!Observable.fromEvent不像Jquery事件监听器那样一直在监听。这不会导致页面变慢吗?我们为什么不使用.switchMap(()=>Observable.fromEvent(…).map(…).takeUntil()?如果我们把map放在switchMap()内部,我担心放更多的switchMap()调用(例如承诺链)会导致太多嵌套。@NikhilAgarwal如果你把它们放在外部,您正在将这些运算符应用于顶级流—这意味着takeUntil
将取消整个epic—您将不会侦听未来的操作,`map
在本例中不会产生任何影响,但如果您使用catch
添加错误处理,它将--您不希望错误在开关映射
之外冒泡,否则错误将到达类型为
的操作$,epic将终止。这有时被称为“隔离观察者链”,所以我们这样做是为了确保类型为
的action$不会终止。这是否意味着可以在第一个switchMap()中执行我上面建议的操作?例如:-action$of type(…).switchMap(()=>observeable.fromPromise(…).switchMap(()=>observeable.fromPromise(…).switchMap(…).map(…).takeUntil(…)
这意味着我只需要做一级嵌套来隔离观察者链。@NikhilAgarwal就其本质而言,我不能说嵌套一级总是解决方案,但在您的情况下,如果您所关心的不是将错误传播到顶层,那么是的!的确,在大多数可观察到的redux情况下,一级隔离通常是标准的,但并非总是且绝对不是所有RXJ的情况。希望这有帮助!Observable.fromEvent不像Jquery事件监听器那样一直在监听。这不会导致页面变慢吗?