0

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

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

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

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

4

2 回答 2

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 类本身中,以您最容易维护的为准。

于 2009-04-27T14:40:15.850 回答
0

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

于 2009-04-25T05:22:11.510 回答