2009-04-25 6 views
0

현재 프리젠 테이션 모델 패턴을 사용하여 Flex/PHP 프로젝트의 클라이언트 측을 구축 중입니다.
나는 현재 노드라는 도메인 개체에 대한 편집 할 정보를 표시하는 뷰를 가지고 : 나는 달성하기 위해 노력하고있어프리젠 테이션 모델에서 클라이언트 측 도메인 객체 상태 처리

. 노드가 편집 가능하고 사용자에게 적절한 권한이 있는지 여부에 따라이 오브젝트를 변경할 수있는 곳에서 추가보기를 사용할 수 있습니다. 사용자가 "변경 사항 저장"을 결정하면 모든 변경 사항이 서버에 커밋됩니다. 노드 A가 변경되고 사용자가 노드 B를 저장하지 않고 다른 노드 B로 이동하면 NodeA는 원래 상태로 되돌아갑니다.

디자인 :
나는 현재 노드에 대한 참조를 보유하는 정보를보기위한 PM 있습니다. 편집 뷰의 PM은이 정보 PM에서 확장되어 래핑 된 Node 객체를 변경하는 메소드를 추가합니다. 두 PM 모두 동일한 노드 참조가 그들에 주입되고 정보/편집보기의 모든 필드는 PM을 통해 노드에 바인딩됩니다.

문제 :
사용자가 NodeA에 변경 내용을 만들지 만 커밋하지 않습니다, 나는 다시 원래 상태로 되돌릴 수있는 우아한 해결책을 생각할 수없는 것. 기본적으로, 지금까지 생각한 것은 편집 PM에 별도의 값 사본을 보관하는 것입니다. 복제본은 새로운 노드 참조를 생성하거나 동일한 노드 속성 세트를 통해 복제합니다. 이 두 가지 중 이전 노드는 이미 도메인 논리를 포함하고 있기 때문에 더 좋은 아이디어 인 것처럼 보이지만 제한된 범위에서 사용 되더라도 고유 한 도메인 개체의 복제본을 만드는 것이 나쁜 방법인지 궁금합니다.

답변

0

각보기는 자신의 Presentation Model 클래스 인스턴스 여야합니다. 다른보기로 이동할 때 사용자가 저장하지 않은 경우 메모리에 유지하십시오. 복제는보다 복잡한 과정을 통해 기본적으로 동일한 결과를 얻습니다.

+0

보기에는 자체 PM 인스턴스가 있지만 두 PM 모두에 삽입 된 동일한 노드 인스턴스에 대한 참조를 보유합니다.그들에게 동일한 노드의 개별 인스턴스를 제공한다면 노드 인스턴스의 맵/풀 (ID 별)을 유지하면서 모델에 과감한 변경을 가하고 있습니다. – Stiggler

+0

두 개의 노드에 대해 두 가지보기가있는 것처럼 보이는 질문이 생겼습니다. 각각의 PM 인스턴스가있는 두 개의 뷰가 동일한 노드를 참조하는 이유는 무엇입니까? 이 경우 두 인터페이스보기가 실제로 동일한 인터페이스의 두 부분 일 수 있습니다.이 경우 둘 다 PM 만 있습니다. –

+0

양쪽보기에 대해 하나의 PM이있는 경우 어떻게 내 문제를 해결할 수 있습니까? 나는 그것이 실제로 어떻게 다른지를 보지 못한다. – Stiggler

1

나는 VO가 필요할 때 원래의 데이터를 값 객체 ("VO")의 XML 속성에 저장하고 다른 모든 속성 값을 재설정하여 비슷한 경우를 처리합니다.

는 처음 볼 수 있도록 필요한 경우

그래서, 나는 XML 가서 : 내가 제일 먼저의 인스턴스를 만들어 내 결과 핸들러에서 XML을 검색 할 때

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

을 내 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와 Get에서 동일한 형식으로 VO의 데이터를 전달한 다음 위와 같이 XML을 저장하여이 문제를 해결합니다.

일반적으로 Cairngorm MVC 응용 프로그램에서이 작업을 수행하므로 이벤트/명령 체인을 모두 처리 할 수 ​​있지만이 기능을 원하는 클래스 수나 VO 클래스 자체 중 어느 것이 든 가장 쉬운 방법으로 사용할 수 있습니다 당신은 유지해야합니다.

+0

입력 해 주셔서 감사합니다! 비슷한 상황을 다른 사람들이 어떻게 처리했는지 확인하는 것이 좋습니다. 필자의 경우 XML 객체는 DTO이지만 내 모델 객체에 대한 참조는 유지하지 않는 것이 좋습니다. 그러나 DTO를 저장하고 "재설정"방법을 어딘가에 구현하는 방법은 아마이 문제를 해결할 방법 일 것입니다. 구현 된 후에이 질문을 다시 살펴 보겠습니다. – Stiggler