我一直在尝试创建一些 cycle.js 示例作为嵌套对话,并使用选择框在它们之间切换。
其中一个对话是官方 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 请求日志只触发一次,但如果您在开发工具中观察网络活动,您会同时看到两个 GET 请求。
谢谢你的帮助!
编辑:解决了我自己的问题。请参阅下面的答案。