【问题标题】:Avoiding duplicate data & calculations in view-models避免视图模型中的重复数据和计算
【发布时间】:2011-07-26 02:28:37
【问题描述】:

我正在开发一个使用 MVVM 的 Flex 应用程序。我知道建议在视图和视图模型之间进行一对一的映射。如果在多个视图中需要相同的数据,我该如何避免多次执行相同的计算和存储?

例如,假设我有一个程序可以加载由项目列表组成的项目文件。我的应用程序的主选项卡有一个导出按钮,只有在项目有效时才应启用该按钮,因此我在主选项卡的视图模型上创建了一个 isExportEnabled 属性。对此的计算涉及通过迭代项目中的每个项目并验证每个项目的某些属性来验证项目。我有另一个标签,它有一个“打印项目摘要”按钮,所以这个标签的视图模型有isPrintEnabled。此标志的值基于相同的标准,无论项目是否有效。

  1. 我可以将用于确定这些值的逻辑放在它们各自的视图模型中,但最终在加载项目时会计算两次相同的值。

  2. 我可以将isValid 移至域模型,但随后模型变得非规范化。如果编辑保存的项目而不更新“isValid”标志怎么办?

  3. 我可以为整个项目创建一个全局“项目视图模型”,计算项目是否有效,然后让isExportEnabledisPrintEnabled 委托给它。但是,我最终得到了本文建议避免使用的视图模型层次结构:Applying the Presentation Model in Flex

感觉好像没有正确的方法来做到这一点。

【问题讨论】:

    标签: apache-flex mvvm viewmodel


    【解决方案1】:

    所以您是说您有两个基于相同验证功能的用户手势,“导出”和“打印项目摘要”?如果我正确地阅读了您的帖子,那么您可以计算一次并有两个吸气剂

    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”上保留该值,因为模型应该知道它是否有效。然后表示层将使用该值来确定如何向用户表示这是一个无效项目(弹出窗口、警报、错误字符串)。

    在其他情况下,我会在这些按钮“设置选定项目”的演示者上创建一个设置器,并在那里运行我的验证和/或更改我的按钮启用状态。

    我真的很想听听其他人对此的看法。

    【讨论】:

    • 感谢您的回答。我重写了一些问题,因为它不像我在第二次阅读时想象的那么清楚。
    猜你喜欢
    • 1970-01-01
    • 2011-01-10
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多