我一直在尝试创建一些cycle.js示例作为嵌套对话框,并使用选择框在它们之间切换。Cycle.js添加加载指示器后HTTP发送多个请求
其中一个对话框是官方Github HTTP搜索示例的克隆。
其他对话更基本的一个没有HTTP,只有DOM。
我觉得自己像是围绕在2之间进行切换,但是我对Rx很新,所以可能会做得不正确或者天真。
这一切似乎运作良好,直到我添加一个加载指标到搜索页面。
为了做到这一点,我把这个:
const vTree$ = responses.HTTP
.filter(res$ => res$.request.indexOf(GITHUB_SEARCH_API) === 0)
.flatMapLatest(x => x)
.map(res => res.body.items)
.startWith([])
.map(results =>
h('div.wrapper', {}, [
h('label.label', {}, 'Search:'),
h('input.field', {type: 'text'}),
h('hr'),
h('section.search-results', {}, results.map(resultView)),
])
)
进入这个:
const searchResponse$ = responses.HTTP
.filter(res$ => res$.request.indexOf(GITHUB_SEARCH_API) === 0)
.flatMapLatest(x => x)
.map(res => res.body.items)
.startWith([])
const loading$ = searchRequest$.map(true).merge(searchResponse$.map(false))
// Convert the stream of HTTP responses to virtual DOM elements.
const vtree$ = loading$.withLatestFrom(searchResponse$, (loading, results) =>
h('div.wrapper', {}, [
h('label.label', {}, 'Search:'),
h('input.field', {type: 'text'}),
h('span', {}, loading ? 'Loading...' : 'Done'),
h('hr'),
h('section.search-results', {}, results.map(resultView)),
])
)
我现在有2个问题
- 和 '设置为复选框值'对于每次更改复选框,都会记录 两次的“路由已更改”消息。
- 仅HTTP请求日志 会触发一次,但如果您在Dev Tools 中观看网络活动,您将同时看到两个GET请求。
感谢您的帮助!
编辑:解决了我自己的问题。见下面的答案。
您正在使用'loading $ .withLatestFrom()',所以当'loading $'有一个新值时它只会产生一个新值。试试'combineLatest()'。 –
我最初创建了一个中间可观察的'state $ = Rx.Observable.combineLatest(searchResponse $,loading $, (resp,loading)=> {return {results:resp,loading:loading}})''。它的工作原理完全一样,因为每次响应都会加载$更改。加载指示器工作得很好,问题是我的HTTP请求触发了2次而不是1次。如果删除加载指示器代码,请求像他们应该一样射击。我觉得它与我如何实现嵌套对话有关。 – SkaterDad