我如何防止事件循环与FRP(和培根.js)
How do I prevent event cycles with FRP (and bacon.js)
我已经成功地在我的培根驱动的应用程序中创建了一个循环,所以我需要一些关于如何打破它的建议。
假设我们有几个属性,它们携带应用程序的某些状态。这种状态应该通过HTML5历史API (pushState
)来存储,因此我将这些属性组合到一个对象并对其执行pushState
。但是,我还需要覆盖popstate
事件,因此在每个popstate
(后退按钮等)上,我将状态对象拆分为单个属性并将它们注入其原始流。
现在我有了一个循环:因为这些属性流是我首先得到pushState
的相同流,pushState
再次被调用,复制堆栈上的状态,使后退按钮无用。
这当然是我的错误,然而,除了将每个属性流分成两个并在pushState
/popState
特定的情况下以不同的方式组合它们之外,我没有看到一个好的解决方案。但这似乎相当不优雅——有没有什么规范的方法来避免这种循环?
我想到的最优雅的解决方案是在推送新状态之前检查当前状态。如果它们是相同的,什么都不做:
// state properties
var foo = ...;
var bar = ...;
// write
var history = Bacon.combineAll(makeHistoryState, foo, bar);
history.onValue(function (v) {
if (!_.isEqual(history.state, v)) {
history.pushState(v);
}
});
// read
window.addEventListener("popstate", function(event.state) {
foo.set(extractFoo(event.state));
bar.set(extractBar(event.state));
});
免责声明:我没有自己测试
编辑:当拥有全局状态作为单个属性时,它被保存到历史API中;一切simplfies。你可以利用培根。模型镜头功能
相关文章:
- 可以't让我的if语句处理js中的html表单输入
- 使用agility.js进行页面布局和合成
- 使用Clipboard.js复制span文本
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 强制模板刷新ember.js
- 如何编写HTML输入的JS内联
- Angular JS IE9 Hashbang url rewriting
- 使用JS将数组转换为json对象
- Node.js v6.2.0类扩展不是函数错误
- 当js函数's已执行
- 要求未定义JS回调参数
- Fighting with FRP
- 在自定义mean.io包中使用angular-chart.js作为依赖项
- 无法在数据endVal中设置值=“”;{{ucount}}”;使用Angular JS的CountUp
- 如何从Java/scala调用js美化程序
- 如何更改<svg>标记为<img>用js标记
- 如何使用 node.js 比较两个 json 数组
- 我如何防止事件循环与FRP(和培根.js)
- js (FRP) -从数组中添加/删除值并保存在存储中
- node.JS和FRP(bacon.JS)中的原生JS