[英]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.