我正在尝试确定处理MVVM中的计算字段或方法的正确模式。我有许多计算字段,这些字段对于表示层和一些后端处理都是必需的。假设它是“CalculateTotal
”,它基于对Data对象及其子对象中的许多不同值求和。
我想在一个位置进行此计算。第一个想法是它属于模型(即,不是viewModel),因为模型对象将被传递给其他后端处理系统。那么将ViewModel
提供给哪些人的最佳方式是什么?
选项1,是我在基于Model
创建viewModel时静态加载viewModel(例如,vwModel.Total = model.CalculateTotal()
)
如果我需要动态更新ViewModel
,这会受到影响,例如我修改基础数据并试图获得新的总数。
选项2:更加面向服务,每次计算都会调用服务来返回值。我看到的问题是基于性能的更多。一旦我加载了一次对象,我就拥有了执行计算所需的所有数据。似乎每次调用都需要重新加载数据对象
选项3:让ViewModel
包含数据模型并创建调用数据模型方法的方法
思考?建议?
答案 0 :(得分:1)
我会在模型中进行所有计算。视图模型应订阅模型上的事件(例如,通过INotifyPropertyChanged
),因此当后端值更改时,将通知视图模型。
视图模型当然可以询问模型以进行计算,而不必通过事件获取所有信息。以上仅适用于数据更改直接来自模型或基础数据层的情况。
答案 1 :(得分:1)
我会选择类似于选项2的东西。将计算逻辑移出模型和视图模型将简化事情并使其他类可以重复使用该逻辑。从您的问题看来,您似乎已经知道如何实现它。保持模特"哑巴"并且如果模型传递很多,那么知道如何处理模型的服务/实用程序/帮助程序类将帮助您长期运行。只需考虑一下,但保持课堂责任非常有限,可以让您更轻松地维护代码。你最终可能会有更多的课程,但我个人觉得更容易集中精力和工作在两个或三个小班级而不是一个非常大的班级。我不知道您的应用程序类型或计算的重要程度,但除非您遇到可衡量的性能问题,否则我不会担心尝试预先优化。
答案 2 :(得分:0)
我希望在一个位置进行此计算。
如果有专用Service Layer
,则几乎所有计算都应在Service Layer
中完成。
选项1
不是在CalculateTotal
上使用Model
方法,而是每次Total
更好地制作只读属性Model
并在服务层方法中计算它请求。如果没有性能问题,这是最简单和最好的选择,因为它大大简化了ViewModel。
选项2
如果计算过程是资源密集型的,并且每次请求CalculateTotal
时都不使用计算总数,则ViewModel
从Model
调用专用var defaultState = {
animals: Object.assign({}, placeholder),
architecture: Object.assign({}, placeholder)
};
if (currentState === undefined) {
nextState = defaultState;
return nextState;
}
nextState = {
animals : animalReducer(nextState.animals, action),
architecture : architectureReducer(nextState.architecture, action)
}
服务方法是唯一可用的选项。