动作可以成为 MVVM 的 ViewModel 的一部分吗?
Could actions be a part of MVVM's ViewModel?
我有一个写成 swift 的 viewModel 是这样的:
public protocol NewsViewModel {
var imageString: String? { get }
var title: String? { get }
var dateString: String? { get }
var action: (() -> ())? { get set}
}
然后我的核心数据对象符合viewModel如下:
extension NewsDataObject {
private func viewModel(action: (() -> ())?) -> NewsViewModel {
struct NewsViewModelDefault: NewsViewModel {
var imageString: String?
var title: String?
var dateString: String?
var action: (() -> ())?
}
return NewsViewModelDefault(imageString: imgUrlString,
title: articleTitle,
dateString: pubDate,
action: action)
}
}
在 viewModel 中使用动作是好的做法吗?如果是或否,优点和缺点是什么?
我认为这真的是一个基于你的行为所做的判断。如果您的操作只是更新 UI,那么将其保留在控制器或视图中是有意义的。但是,如果它本质上与模型或网络层是一体的,那么将它移到视图模型中可能是有意义的。
也许您可以在这里详细说明您的情况以获得更好的建议?
一般来说,我总是会在视图或控制器中实现初始控制处理程序。如果需要,然后在视图模型上调用方法。
/*
MyController
*/
myButton.add(target: self, action, #selector(buttonHandler), for: .touchUpInside)
func buttonHandler() {
// Decide here if the actual logic belongs in the view model or controller
}
因此,捕捉动作并将逻辑传递到最有意义的地方。至少我会这样处理。
我有一个写成 swift 的 viewModel 是这样的:
public protocol NewsViewModel {
var imageString: String? { get }
var title: String? { get }
var dateString: String? { get }
var action: (() -> ())? { get set}
}
然后我的核心数据对象符合viewModel如下:
extension NewsDataObject {
private func viewModel(action: (() -> ())?) -> NewsViewModel {
struct NewsViewModelDefault: NewsViewModel {
var imageString: String?
var title: String?
var dateString: String?
var action: (() -> ())?
}
return NewsViewModelDefault(imageString: imgUrlString,
title: articleTitle,
dateString: pubDate,
action: action)
}
}
在 viewModel 中使用动作是好的做法吗?如果是或否,优点和缺点是什么?
我认为这真的是一个基于你的行为所做的判断。如果您的操作只是更新 UI,那么将其保留在控制器或视图中是有意义的。但是,如果它本质上与模型或网络层是一体的,那么将它移到视图模型中可能是有意义的。
也许您可以在这里详细说明您的情况以获得更好的建议?
一般来说,我总是会在视图或控制器中实现初始控制处理程序。如果需要,然后在视图模型上调用方法。
/*
MyController
*/
myButton.add(target: self, action, #selector(buttonHandler), for: .touchUpInside)
func buttonHandler() {
// Decide here if the actual logic belongs in the view model or controller
}
因此,捕捉动作并将逻辑传递到最有意义的地方。至少我会这样处理。