Swift Bond 中模型和 viewModel 的绑定
Binding of model and viewModel in Swift Bond
我正在使用 Swift Bond 进行视图与 viewModel 的双向绑定。这是通过 bidirectionalBind 实现的。
问题是:
将模型与 viewModel 绑定的常见做法是什么,更具体地说,模型如何知道 viewModel 中所做的更改。在 ReactiveCocoa 中有 RACChannel 可以做到这一点,所以你可以在不改变模型属性类型的情况下绑定 viewModel 和模型。
主要目标是保持模型非常简单,仅使用 String、Int、Date 等基本类型,并将 Observable 和 属性 类型移动到 viewModel。
插图:
import Bond
import ReactiveKit
struct Person {
var name: String
var age: Int
var birthdate: Date
}
struct PersonViewModel {
fileprivate var person: Person
var name: Observable<String>
var age: Observable<Int>
var birthDate: Observable<Date>
init(person: Person) {
self.person = person
// what should go here in order to bind properties???
}
}
为了将您的 ViewModel
和 Model
双向绑定在一起,您需要在 Person
Model
中具有可绑定的属性,这听起来像是您想要的避免。无法绑定到纯 Int、String 或 Date 类型。
您可以修改您的 Model
以使用可绑定属性,或者您可以构建一个解决方案,让您的 Model
通过某种类型的可观察抽象与您的 ViewModel
交互。
biDirectionalBind
通常用于将 ViewModel
层中的属性与视图层绑定,以便将用户交互的更新传递回 ViewModel
,例如:
let name = Property<String>("Fred")
let textField = UITextField()
name.bidirectionalBind(to: textField.bnd_text)
我正在使用 Swift Bond 进行视图与 viewModel 的双向绑定。这是通过 bidirectionalBind 实现的。
问题是: 将模型与 viewModel 绑定的常见做法是什么,更具体地说,模型如何知道 viewModel 中所做的更改。在 ReactiveCocoa 中有 RACChannel 可以做到这一点,所以你可以在不改变模型属性类型的情况下绑定 viewModel 和模型。
主要目标是保持模型非常简单,仅使用 String、Int、Date 等基本类型,并将 Observable 和 属性 类型移动到 viewModel。
插图:
import Bond
import ReactiveKit
struct Person {
var name: String
var age: Int
var birthdate: Date
}
struct PersonViewModel {
fileprivate var person: Person
var name: Observable<String>
var age: Observable<Int>
var birthDate: Observable<Date>
init(person: Person) {
self.person = person
// what should go here in order to bind properties???
}
}
为了将您的 ViewModel
和 Model
双向绑定在一起,您需要在 Person
Model
中具有可绑定的属性,这听起来像是您想要的避免。无法绑定到纯 Int、String 或 Date 类型。
您可以修改您的 Model
以使用可绑定属性,或者您可以构建一个解决方案,让您的 Model
通过某种类型的可观察抽象与您的 ViewModel
交互。
biDirectionalBind
通常用于将 ViewModel
层中的属性与视图层绑定,以便将用户交互的更新传递回 ViewModel
,例如:
let name = Property<String>("Fred")
let textField = UITextField()
name.bidirectionalBind(to: textField.bnd_text)