2011-07-26 64 views
1

我正在使用MVVM的Flex应用程序。我知道建议在视图和视图模型之间建立一个1对1的映射关系。那么如何避免执行相同的计算并在多个视图中多次存储相同的数据?在视图模型中避免重复的数据和计算

例如,假设我有一个程序可以加载包含项目列表的项目文件。我的应用程序的主选项卡有一个导出按钮,只有在项目有效时才能启用,因此我在主选项卡的视图模型上创建isExportEnabled属性。对此的计算涉及验证项目,方法是遍历项目中的每个项目并验证每个项目的属性。我有另一个有“打印项目摘要”按钮的选项卡,因此此选项卡的视图模型有isPrintEnabled。该标志的值基于相同的标准,无论项目是否有效。

  1. 我可以把逻辑在其相应视图的模型确定这些值,但是然后我最终当一个项目被装载计算两次相同的值。

  2. 我可以将isValid移动到领域模型,但然后模型变得非规范化。如果在不更新“isValid”标志的情况下编辑保存的项目会怎样?

  3. 我可以为整个项目制作一个全球“项目视图模型”,它计算项目是否有效,然后有isExportEnabledisPrintEnabled委托给它。不过,后来我结束了视图模型本文建议避免其中的一个层次:Applying the Presentation Model in Flex

感觉就像有做这种没有正确的方法。

回答

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; 
} 

现在,有些人可能会说,因为他们正在返回,我们应该摆脱干将相同的值,并返回一个简单的[绑定]公共价值。但是由于这看起来是这个特性的第一个实现,所以拥有两个独立的函数可以让您在面对不断变化的UI和验证需求时获得一些稳健性。个人来说,如果验证逻辑太重了,我会在我的模型“public var isValidProject”上保留这个值,因为模型应该知道它是否有效。然后,表示层将使用该值来确定如何向用户表示这是一个无效项目(弹出窗口,警报,错误字符串)。

在其他情况下,我会在这些按钮的主持人“set selectedProject”上设置一个setter,然后运行我的验证和/或更改我的按钮启用状态。

我真的很想听到别人对此的想法。

+0

感谢您的回答。我重写了一些问题,因为它不像我在二读时那么清楚。 – takteek