![](/img/trans.png)
[英]SwiftUI/ Combine Listen to multiple publishers inside an ObservableObject
[英]SwiftUI Is it ok to put an ObservableObject inside another ObservableObject?
我有一个名为PurchaseView
的视图。 此视图显示有关购买、购买的内容和购买者的详细信息。 我正在做的是,在这个视图中,我将ItemView
和ClientView
都放在PurchaseView
中。 ItemView
和ClientView
是共享的,并且在我的应用程序的其他部分中使用。 他们有自己的 ViewModel。
我也尝试将ItemViewModel
和ClientViewModel
放入PurchaseViewModel
但我不知道是否可以将ObservableObject
放入另一个ObservableObject
。 这是一个好方法还是ObservableObject
内不应该有任何ObservableObject
? 以下哪一项更好?
这个?
class PurchaseViewModel: ObservableObject {
let clientViewModel: ClientViewModel
let itemsViewModel: ItemViewModel
//
}
或这个?
struct PurchaseView: View {
@ObservedObject var purchaseViewModel: PurchaseViewModel
@ObservedObject var itemViewModel: ItemViewModel
@ObservedObject var clientViewModel: ClientViewModel
var body: some View {
//
}
}
购买 model:
class Purchase {
let id: String
let total: Double
// ...
var item: Item?
var client: Client?
}
您的第一个解决方案将不起作用,因为对嵌套 ObservableObjects 的更改不会向上传播:
class PurchaseViewModel: ObservableObject {
let clientViewModel: ClientViewModel
let itemsViewModel: ItemViewModel
...
}
可以在此处找到解决方法:如何告诉 SwiftUI 视图绑定到嵌套的 ObservableObjects 。
您的第二种方法是正确的,并且适用于大多数情况:
struct PurchaseView: View {
@ObservedObject var purchaseViewModel: PurchaseViewModel
@ObservedObject var itemViewModel: ItemViewModel
@ObservedObject var clientViewModel: ClientViewModel
...
}
如果您为多个视图共享一个ObservableObject
,则可以将其注入环境并作为@EnvironmentObject
访问。
或者,您可以将嵌套的 ObservableObjects 设置为structs :
class PurchaseViewModel: ObservableObject {
@Published var clientViewModel: ClientViewModel // <- add `@Published`
...
}
struct ClientViewModel { // <- use `struct` instead of `class`
...
}
请注意,您的ClientViewModel
将在每次它(或其任何属性)更改时成为一个新结构 - 此解决方案不应过度使用(尤其是对于复杂的 ViewModel)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.