Обработка состояния объекта на стороне клиента в модели представления - PullRequest
0 голосов
/ 25 апреля 2009

В настоящее время я строю клиентскую часть проекта Flex / PHP с использованием шаблона Presentation Model.

Чего я пытаюсь достичь:
В настоящее время у меня есть представление, отображающее нередактируемую информацию об объекте домена с именем Node. В зависимости от того, является ли узел доступным для редактирования и пользователь имеет необходимые привилегии, становится доступным дополнительное представление, в котором можно вносить изменения в этот объект. Любые внесенные изменения фиксируются на сервере только после того, как пользователь решает «Сохранить изменения». Если в NodeA внесены изменения, и пользователь переходит на другой NodeB, не сохраняя их, NodeA возвращается в исходное состояние.

Конструкция:
У меня есть PM для информационного представления, содержащего ссылку на текущий узел. PM для представления редактирования расширен от этой информации PM, добавив методы для внесения изменений в обернутый объект Node. Оба PM имеют одинаковую ссылку на Node, и все поля в представлениях info / edit связаны с Node через свои PM.

Проблема:
Когда пользователь вносит изменения в NodeA, но не фиксирует их, я не могу придумать элегантного решения для возврата к исходному состоянию. По сути, до сих пор я думал о том, чтобы хранить отдельные копии значений в редактируемом PM, либо путем клонирования, создавая новую ссылку на Node, либо с помощью идентичного набора свойств Node. Из этих двух первый вариант кажется более удачной, поскольку в Узле уже размещена логика домена, но мне интересно, является ли создание клонов уникальных объектов домена плохой практикой, даже если она используется в ограниченном объеме.

Ответы [ 2 ]

1 голос
/ 27 апреля 2009

Я обрабатываю аналогичные случаи, сохраняя исходные данные в свойстве XML объекта Value («VO»), и сбрасываю все остальные значения свойств, когда требуется 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.

Единственное, что вам нужно сделать, это сбросить этот XML каждый раз, когда пользователь вносит изменения в VO. Я обычно справляюсь с этим, передавая данные VO в том же формате в Save and Get, а затем сохраняя XML, как описано выше.

Обычно я делаю это в приложении Cairngorm MVC, поэтому у меня есть цепочка событий / команд для обработки всего этого, но вы можете поместить эту функциональность в любое количество классов или в сам класс VO, в зависимости от того, что проще для вас поддерживать.

0 голосов
/ 25 апреля 2009

У каждого представления должен быть свой экземпляр класса презентации. Просто сохраните его в памяти, если пользователь не сохранил его при переходе в другое представление. Клонирование выполняет в основном то же самое посредством более запутанного процесса.

...