在表示模型中处理客户端域对象状态

时间:2009-04-25 02:23:59

标签: flex design-patterns dns presentation-model

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

因此,当首次需要查看时,我会得到XML:

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

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

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类本身中,以最简单的方式为您服务维持。

答案 1 :(得分:0)

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

相关问题