【问题标题】:Handling client-side domain object state in a presentation model在表示模型中处理客户端域对象状态
【发布时间】:2009-04-25 02:23:59
【问题描述】:

我目前正在使用演示模型模式构建 Flex/PHP 项目的客户端。

我想要达到的目标:
我目前有一个视图显示有关名为 Node.js 的域对象的不可编辑信息。根据节点是否可编辑以及用户是否具有正确的权限,可以在其中更改此对象的附加视图可用。一旦用户决定“保存更改”,所做的任何更改才会提交给服务器。如果对 NodeA 进行了更改并且用户导航到不同的 NodeB 而不保存它们,则 NodeA 将恢复到其原始状态。

设计:
我有一个信息视图的 PM,其中包含对当前节点的引用。编辑视图的 PM 是从这个 info PM 扩展而来的,添加了对包装的 Node 对象进行更改的方法。两个 PM 都注入了​​相同的 Node 引用,并且 info/edit 视图中的所有字段都通过它们的 PM 绑定到 Node。

问题:
当用户对 NodeA 进行更改但没有提交时,我似乎想不出一个优雅的解决方案来恢复到原始状态。基本上,到目前为止我想到的是在编辑 PM 上保存单独的值副本,或者克隆创建一个新的节点引用,或者通过一组相同的节点属性。在这两个中,前者似乎是更好的主意,因为 Node 已经包含域逻辑,但我想知道创建唯一域对象的克隆是否是一种不好的做法,即使它在有限的范围内使用。

【问题讨论】:

    标签: apache-flex design-patterns dns presentation-model


    【解决方案1】:

    我通过将原始数据存储在值对象 (“VO”) 的 XML 属性中来处理类似情况,并在需要 VO 时重置所有其他属性值。

    所以,当第一次需要查看时,我去获取 XML:

    <Node>
        <prop1>value</prop1>
        <prop2>value</prop2>
        <prop3>value</prop3>
        <prop4>value</prop4>
    </Node>
    

    当我检索 XML 时,在我的结果处理程序中,我做的第一件事是创建我的 VO 的实例,并设置 XML 属性,然后在单独的类中调用公共函数来设置 VO 的属性:

    private function getNodeResultHandler(event:ResultEvent):void
    {
        var myNode:Node = new Node();
    
        myNode.xmlData = new XML(event.result);
    
        nodeUtils.setNodeProperties(myNode);
    }
    
    public class nodeUtils
    {
        public function setNodeProperties(node:Node):void
        {
            var nodeXmlData:XML = node.xmlData;
    
            myNode.prop1 = nodeXmlData.prop1;
    
            myNode.prop2 = nodeXmlData.prop2;
    
            myNode.prop3 = nodeXmlData.prop3;
    
            myNode.prop4 = nodeXmlData.prop4;
        }
    }
    

    然后,每当您将视图切换到编辑模式时,您都会调用相同的函数将属性重置为存储在 XML 中的值。

    您唯一需要做的另一件事是在用户提交对 VO 的更改时重置该 XML。我通常通过在 Save and Get 上以相同格式传回 VO 的数据来处理这个问题,然后像上面一样保存 XML。

    我通常在 Cairngorm MVC 应用程序中执行此操作,因此我有事件/命令链来处理所有这些,但您可以将此功能放在任意数量的类中,或放在 VO 类本身中,以对您最简单的为准维护。

    【讨论】:

    • 感谢您的意见!很高兴看到其他人如何处理类似情况。在我的例子中,XML 对象是一个 DTO,但我宁愿不在我的模型对象上维护对它的引用。但是,存储 DTO 并在某处实现“重置”方法可能是我最终处理这个问题的方式。实施后,我将重新审视这个问题。
    【解决方案2】:

    每个视图都应该有它自己的 Presentation Model 类的实例。如果用户在移动到另一个视图时没有保存它,只需将其保存在内存中。克隆通过一个更复杂的过程完成了基本相同的事情。

    【讨论】:

    • 视图确实有自己的 PM 实例,但两个 PM 都持有对注入到两者中的同一个 Node 实例的引用。如果我要为它们提供相同节点的单独实例,我将对我的模型进行重大更改,因为我正在保留节点实例的映射/池(按 id)。
    • 您的问题看起来好像您有两个节点的两个视图。为什么两个视图都有自己的 PM 实例引用同一个节点?如果是这种情况,可能您的两个视图实际上是同一界面的两个部分,在这种情况下,两者只有一个 PM。
    • 如果我的两个视图都只有一个 PM,那将如何解决我的问题?我真的不明白它有什么不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多