Cycle.js/xstream 点击事件流式传输一次,但触发两次
Cycle.js/xstream click event streamed once, but fired twice
页面上有一个按钮元素和以下点击流:
let submitClick$ = sources.DOM.select(buttonSel)
.events("click")
.mapTo(true)
.debug(console.log)
单击按钮后,true
被记录,这是正确的。
但是,当我映射流时,里面的代码运行了两次:
let submitDeal$ = submitClick$.map(() => {
console.log("Clicked")
// ...
})
按钮不应附加其他事件处理程序,元素本身位于 div:
button(".btn--add", "Submit")
通常的 event.preventDefault()
和 event.stopPropagation()
没有区别,检查事件确实表明它是从同一元素触发的 button.btn--add
.
不太确定发生了什么,欢迎提供任何想法!谢谢!
版本:
"@cycle/dom": "^12.2.5"
"@cycle/http": "^11.0.1"
"@cycle/xstream-run": "^3.1.0"
"xstream": "^6.4.0"
更新 1: 我检查了三次,没有 JS 文件被加载两次。我使用的 Webpack 捆绑了加载到页面上的单个 app.js
文件(Elixir/Phoenix 应用程序)。此外,在 Chrome 的开发人员工具中检查 Event Listeners
选项卡中的按钮时,似乎只附加了 1 个已处理的事件。
更新二: Gist with the code
提供的信息太少无法解决此问题。但是我想到了一些事情:
您不应使用 .debug(console.log)
,而应使用 .debug(x => console.log(x))
。其实.debug()
就够了,内部会用console.log
那么,按钮里面是不是<form>
?这可能会影响事件。一般来说,这个问题需要更多细节。
原来这是由于 xstream 中的一个错误,该错误已在 xstream@7.0.0
中修复。
页面上有一个按钮元素和以下点击流:
let submitClick$ = sources.DOM.select(buttonSel)
.events("click")
.mapTo(true)
.debug(console.log)
单击按钮后,true
被记录,这是正确的。
但是,当我映射流时,里面的代码运行了两次:
let submitDeal$ = submitClick$.map(() => {
console.log("Clicked")
// ...
})
按钮不应附加其他事件处理程序,元素本身位于 div:
button(".btn--add", "Submit")
通常的 event.preventDefault()
和 event.stopPropagation()
没有区别,检查事件确实表明它是从同一元素触发的 button.btn--add
.
不太确定发生了什么,欢迎提供任何想法!谢谢!
版本:
"@cycle/dom": "^12.2.5"
"@cycle/http": "^11.0.1"
"@cycle/xstream-run": "^3.1.0"
"xstream": "^6.4.0"
更新 1: 我检查了三次,没有 JS 文件被加载两次。我使用的 Webpack 捆绑了加载到页面上的单个 app.js
文件(Elixir/Phoenix 应用程序)。此外,在 Chrome 的开发人员工具中检查 Event Listeners
选项卡中的按钮时,似乎只附加了 1 个已处理的事件。
更新二: Gist with the code
提供的信息太少无法解决此问题。但是我想到了一些事情:
您不应使用 .debug(console.log)
,而应使用 .debug(x => console.log(x))
。其实.debug()
就够了,内部会用console.log
那么,按钮里面是不是<form>
?这可能会影响事件。一般来说,这个问题需要更多细节。
原来这是由于 xstream 中的一个错误,该错误已在 xstream@7.0.0
中修复。