swift - 如何使用功能性 reactSwift 泛化来自属性的表单输入?
问题描述
在做带有字段的表单时,如果我经常做更改,我想发送
let initialOrChangedName = Signal.merge(
nameChanged.signal,
self.viewDidLoadProperty.signal
.map { _ in nil }
)
在哪里
private let nameChangedProperty = MutableProperty<String?>(nil)
private let viewDidLoadProperty = MutableProperty(())
得到一个在加载时触发一次的信号,所以当用户点击一个按钮时,我可以在 combineLatest 中使用它,该按钮将触发一个带有表单值的 Web 请求到服务器。由于此信号合并,它将给出在初始值之后发生变化的所有值,允许我在用户点击提交按钮时发送最新值
这个用法通常是这样的
Signal.combineLatest(intialOrChangedName, initialOrChangedAge)
.sample(on:sendButtonTappedProperty.signal)
如果值发送为零,我只是不将它们包含在网络请求中,但如果其中一些被用户更改,我会得到其他值。
由于这是一种相当常见的模式,我想将其推广到单个函数,例如
let initialOrChangedName = nameChanged.initialOrChangedState(on: viewDidLoadProperty)
我试过写
extension MutableProperty where Value: OptionalProtocol {
public func initialOrChangedState(on viewDidLoadProperty: MutableProperty<Void>) -> Signal<Value?, Error> {
return Signal.merge(self.signal.map(Optional.init),
viewDidLoadProperty.signal.map { _ in nil})
}
}
哪个在纸上看起来不错,但会返回字符串?对于给出的示例,并且不起作用。
我也尝试将其编写为 Signal 上的静态函数,但没有运气。
解决方案
我想应该是这样的:
extension MutableProperty where Value: OptionalProtocol {
public func initialOrChangedState(on viewDidLoadProperty: MutableProperty<Void>) -> Signal<Value?, Error> {
return self.signal.map({Optional<Value>($0)}).merge(with: viewDidLoadProperty.signal.map({_ in nil}))
}
}
但是,使用 viewDidLoadProperty 有什么意义呢?实际上,如果你在 viewDidLoad() 结束时订阅你的信号,你甚至不需要这样的属性,因此你不需要那个 merge() 东西,你也不需要扩展 MutableProperty 协议。
因此,您需要做的就是:
submitButton.reactive.controlEvents(.touchUpInside).observer(on: UIScheduler()).observeValues({ _ in
readInputs()
launchRequest()
})
推荐阅读
- ios - PageControll 页面 swift 4 的错误号
- android - 在 Xamarin.forms (Android) 中取消警报
- r - R - 通过从其他数据帧组合创建一个完整的数据帧
- angular-cli - Angular-Cli:开发和发布输出的不同路径
- java - 在java中将.prn文件转换为csv文件格式
- typescript - 如何在 .find 方法中编写 OR 条件
- php - 在 Mac OS HighSierra 上使用 Xdebug 调试 php
- javascript - 我应该使用什么技术/策略在谷歌地图中呈现大的 GeoJSON 文件
- javascript - 单击按钮时将显示脚本代码
- python - 无法在 x 轴 matplotlib 中绘制日期时间