我正在使用一个使用MVVM的Flex应用程序。据我所知,建议在视图和视图模型之间进行一对一映射。如果在多个视图中需要多次,我如何避免执行相同的计算并多次存储相同的数据?
例如,假设我有一个程序可以加载包含项目列表的项目文件。我的应用程序的主选项卡有一个导出按钮,只有在项目有效时才能启用该按钮,因此我在主选项卡的视图模型上创建了一个isExportEnabled
属性。对此的计算涉及通过迭代项目中的每个项目并验证每个项目的某些属性来验证项目。我有另一个选项卡,其中包含“打印项目摘要”按钮,因此此选项卡的视图模型为isPrintEnabled
。无论项目是否有效,此标志的值都基于相同的标准。
我可以在各自的视图模型中设置用于确定这些值的逻辑,但是当加载项目时,我最终会计算两次相同的值。
我可以将isValid
移动到域模型,但随后模型变得非规范化。如果在不更新“isValid”标志的情况下编辑保存的项目会怎样?
我可以为整个项目制作一个全局的“项目视图模型”,用于计算项目是否有效,然后让isExportEnabled
和isPrintEnabled
委托给它。但是,我最终得到了一个视图模型层次结构,本文建议避免使用它:Applying the Presentation Model in Flex
感觉没有正确的方法可以做到这一点。
答案 0 :(得分:0)
所以你说你有两个用户手势,“导出”和“打印项目摘要”,它们基于相同的验证功能?如果我正确阅读你的帖子,那么你可以计算一次并有两个吸气剂
private var _isValid:Boolean;
public function validate():Boolean
{
_isValid = //result of calculation
dispatchEvent( new Event("isValidChange") )
}
[Bindable(Event="isValidChange")]
public function get canExport():Boolean
{
return _isValid;
}
[Bindable(Event="isValidChange")]
public function get canPrint():Boolean
{
return _isValid;
}
现在有些人可能会说,因为他们返回相同的值,我们应该摆脱getter并返回一个简单的[Bindable]公共值。但由于这似乎是此功能的第一个实现,因此具有两个独立的功能可以让您在更改UI和验证要求时具有一定的稳健性。
就个人而言,如果验证逻辑太重,我会将该值保留在我的模型“public var isValidProject”上,因为模型应该知道它是否有效。然后表示层将使用该值来确定如何向用户表示这是一个无效项目(弹出窗口,警报,错误字符串)。
在其他情况下,我会在这些按钮“set selectedProject”的演示者上设置一个setter并运行我的验证和/或更改我的按钮启用状态。
我真的很想听到别人的想法。