2009-04-25 2 views
0

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

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

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

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

ответ

0

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

+0

Представления имеют свои собственные экземпляры PM, но оба PM содержат ссылку на тот же экземпляр узла, который вводится в оба.Если бы я должен был обслуживать их отдельными экземплярами одинакового узла, я делаю радикальные изменения в своей модели, поскольку я храню карту/пул экземпляров Node (по id). – Stiggler

+0

Ваш вопрос заставил вас казаться, поскольку у вас есть два вида для двух узлов. Почему два представления с каждым собственным экземпляром PM ссылаются на один и тот же узел? Если это так, возможно, ваши две точки зрения представляют собой две части одного и того же интерфейса, и в этом случае у них есть только один PM для обоих. –

+0

Если бы у меня был только один PM для обоих видов, как бы решить эту проблему? Я действительно не понимаю, как это имеет значение. – Stiggler

1

Я обрабатываю подобные случаи, сохраняя исходные данные в свойстве XML объекта Value («VO») и сбрасывая все другие значения свойств, когда требуется VO.

Так что, когда он первым нужно рассматривать, я иду получить XML:

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

Когда я извлечь XML, в моем результате обработчиком, первое, что я делаю, это создать экземпляр моего В.О., и установить свойство 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 и Get, а затем сохраняя XML так же, как указано выше.

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

+0

Спасибо за ваш вклад! Приятно видеть, как другие справлялись с подобными ситуациями. В моем случае объект XML является DTO, но я бы предпочел не поддерживать ссылку на него на моем объекте модели. Тем не менее, хранение DTO и реализация метода «сброса» где-то, вероятно, заключается в том, как я в конечном итоге справляюсь с этим. Я вернусь к этому вопросу, как только он будет реализован. – Stiggler

Смежные вопросы