查看模型依赖注入
View Model Dependency Injection
ItemDetailViewModel
使用以下签名初始化:
init(item: Item, didPressButton: Observable<Void>, api: FirebaseAPI)
它在 ItemDetailViewController
中初始化,它从源控制器的 segue 获得一个 Item
。我意识到 ItemDetailViewController
在技术上是 View
,因此它不应该将 Item
作为存储的 属性。我如何将 Item
转移到 ItemDetailViewModel
?这也意味着 ItemListViewController
不应该有一个 selectedItem
存储 属性 在 prepareFor(segue:)
.
中使用
可能的解决方案
所以当CollectionView Cell
在ItemListViewController
(源控制器)中被点击时,它应该通过绑定到存储Item
触发ItemListViewModel
,然后perform segue
.同时,在 prepareForSegue
中,我使用 ItemListViewModel
将 ItemDetailViewModel
初始化为 Item
。好的..那可以工作。
如何处理每次点击都会更改其图像的按钮点击?通过功能?
初始化 view models
和 inject dependencies
的正确方法是什么?
您有一个对象需要构建三段数据,但其中一条数据与另外两条数据的来源不同。这是使用高阶函数的好时机。
struct ItemDetailViewModel {
static func factory(item: Item, api: FirebaseAPI) -> (_ action: Observable<Void>) -> ItemDetailViewModel {
return { action in
return ItemDetailViewModel(item: item, didPressButton: action, api: api)
}
}
}
您的视图控制器将接受此函数的结果:
class ItemDetailViewController: UIViewController {
var viewModelFactory: (Observable<Void>) -> ItemDetailViewController = { _ in fatalError("factory called before provided.") }
override func viewDidLoad() {
super.viewDidLoad()
let viewModel = viewModelFactory(myButton.rx.tap.asObservable())
// bind output to view model
}
}
然后在您之前的视图控制器中准备转场:
if let controller = segue.destinationViewController as? ItemDetailViewController {
controller.viewModelFactory = ItemDetailViewModel.factory(item: anItem, api: api)
}
ItemDetailViewModel
使用以下签名初始化:
init(item: Item, didPressButton: Observable<Void>, api: FirebaseAPI)
它在 ItemDetailViewController
中初始化,它从源控制器的 segue 获得一个 Item
。我意识到 ItemDetailViewController
在技术上是 View
,因此它不应该将 Item
作为存储的 属性。我如何将 Item
转移到 ItemDetailViewModel
?这也意味着 ItemListViewController
不应该有一个 selectedItem
存储 属性 在 prepareFor(segue:)
.
可能的解决方案
所以当CollectionView Cell
在ItemListViewController
(源控制器)中被点击时,它应该通过绑定到存储Item
触发ItemListViewModel
,然后perform segue
.同时,在 prepareForSegue
中,我使用 ItemListViewModel
将 ItemDetailViewModel
初始化为 Item
。好的..那可以工作。
如何处理每次点击都会更改其图像的按钮点击?通过功能?
初始化 view models
和 inject dependencies
的正确方法是什么?
您有一个对象需要构建三段数据,但其中一条数据与另外两条数据的来源不同。这是使用高阶函数的好时机。
struct ItemDetailViewModel {
static func factory(item: Item, api: FirebaseAPI) -> (_ action: Observable<Void>) -> ItemDetailViewModel {
return { action in
return ItemDetailViewModel(item: item, didPressButton: action, api: api)
}
}
}
您的视图控制器将接受此函数的结果:
class ItemDetailViewController: UIViewController {
var viewModelFactory: (Observable<Void>) -> ItemDetailViewController = { _ in fatalError("factory called before provided.") }
override func viewDidLoad() {
super.viewDidLoad()
let viewModel = viewModelFactory(myButton.rx.tap.asObservable())
// bind output to view model
}
}
然后在您之前的视图控制器中准备转场:
if let controller = segue.destinationViewController as? ItemDetailViewController {
controller.viewModelFactory = ItemDetailViewModel.factory(item: anItem, api: api)
}