2009-04-25 8 views
0

Ich baue derzeit die Clientseite eines Flex/PHP-Projekts mit dem Präsentationsmodellmuster.Behandeln des clientseitigen Domänenobjektstatus in einem Präsentationsmodell

Was ich zu erreichen versuchen:
Im Moment habe ich einen Blick Anzeige nicht bearbeitbaren Informationen über ein Domain-Objekt namens Knoten. Abhängig davon, ob der Knoten bearbeitbar ist und der Benutzer über die richtigen Berechtigungen verfügt, wird eine zusätzliche Ansicht verfügbar, in der Änderungen an diesem Objekt vorgenommen werden können. Alle vorgenommenen Änderungen werden nur dann auf den Server übertragen, wenn der Benutzer sich entscheidet, Änderungen zu speichern. Wenn Änderungen an einem NodeA vorgenommen werden und der Benutzer zu einem anderen NodeB navigiert, ohne sie zu speichern, wird NodeA in seinen ursprünglichen Zustand zurückgesetzt.

Entwurf:
Ich habe eine Uhr für die Info Ansicht, die einen Verweis auf die aktuelle Knoten zu halten. Die PM für die Bearbeitungsansicht wird von dieser Info-PM erweitert und fügt Methoden hinzu, um Änderungen am umschlossenen Node-Objekt vorzunehmen. Beide PMs haben die gleiche Knotenreferenz, die in sie injiziert wird, und alle Felder in den Info/Edit-Ansichten sind über ihre PMs an den Knoten gebunden.

Das Problem:
Wenn der Benutzer Änderungen an NodeA macht sie aber nicht verpflichten, kann ich nicht von einer eleganten Lösung scheinen zu denken, wieder in den ursprünglichen Zustand zurückzuversetzen. Was ich bis jetzt gedacht habe, ist, separate Wertkopien auf dem PM zu speichern, entweder durch Klonen - Erstellen einer neuen Knotenreferenz oder durch einen identischen Satz von Knoteneigenschaften. Von diesen beiden scheint die erste die bessere Idee zu sein, da der Knoten bereits Domänenlogik enthält, aber ich frage mich, ob das Erstellen von Klonen eindeutiger Domänenobjekte eine schlechte Übung ist, selbst wenn sie in einem begrenzten Umfang verwendet wird.

Antwort

0

Jede Ansicht sollte eine eigene Instanz Ihrer Präsentationsmodellklasse haben. Bewahren Sie es nur im Speicher auf, wenn der Benutzer es beim Verschieben in eine andere Ansicht nicht gespeichert hat. Beim Klonen wird im Grunde dasselbe durch einen komplizierteren Prozess erreicht.

+0

Die Ansichten haben ihre eigenen PM-Instanzen, aber beide PMs enthalten einen Verweis auf dieselbe Knoteninstanz, die in beide injiziert wird.Wenn ich ihnen separate Instanzen eines identischen Knotens liefern sollte, mache ich drastische Änderungen an meinem Modell, da ich eine Karte/einen Pool von Node-Instanzen (nach ID) behalte. – Stiggler

+0

Ihre Frage hat es so aussehen lassen, als hätten Sie zwei Ansichten für zwei Knoten. Warum gibt es zwei Ansichten mit jeweils einer eigenen PM-Instanz, die auf denselben Knoten verweist? Wenn das der Fall ist, sind Ihre zwei Ansichten wirklich zwei Teile der gleichen Schnittstelle, in welchem ​​Fall nur eine PM für beide hat. –

+0

Wenn ich nur eine PM für beide Ansichten hätte, wie würde das mein Problem lösen? Ich sehe nicht wirklich, wie es einen Unterschied macht. – Stiggler

1

Ich handle in ähnlichen Fällen, indem ich die Originaldaten in einer XML-Eigenschaft des Value Object ("VO") speichere und alle anderen Eigenschaftswerte zurücksetze, wenn der VO benötigt wird.

Also, wenn es zuerst gesehen werden benötigt, gehe ich die XML erhalten:

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

Wenn ich die XML abrufen, in meinem Ergebnis-Handler, das erste, was ich tue, ist eine Instanz meines schaffen VO, und stellen Sie die XML-Eigenschaft und dann eine öffentliche Funktion in einer separaten Klasse rufen Sie die VO Eigenschaften einzustellen:

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; 
    } 
} 

dann jederzeit Sie die Ansicht wechseln Modus zu bearbeiten, das nennst du gleiche Funktion zum zurücksetzen die Eigenschaften zu den im XML gespeicherten Werten.

Die einzige andere Sache, die Sie tun müssen, ist, dass XML jedes Mal zurückgesetzt, wenn der Benutzer Änderungen an der VO festschreibt. Ich gehe normalerweise damit um, indem ich die Daten der VO im selben Format auf einem Save and Get zurückschicke und dann die XML-Datei wie oben beschrieben speichere.

Normalerweise mache ich das in einer Cairngorm MVC-Anwendung, also habe ich Event/Befehlsketten, um all dies zu behandeln, aber Sie können diese Funktionalität in beliebig vielen Klassen oder in der VO-Klasse selbst, je nachdem, was am einfachsten ist Sie zu pflegen.

+0

Danke für Ihre Eingabe! Es ist gut zu sehen, wie andere ähnliche Situationen behandelt haben. In meinem Fall ist das XML-Objekt ein DTO, aber ich möchte lieber keinen Verweis darauf auf meinem Modellobjekt beibehalten. Das Speichern des DTO und das Implementieren einer "Reset" -Methode irgendwo ist jedoch wahrscheinlich, wie ich damit umgehen werde. Ich werde diese Frage erneut prüfen, sobald sie implementiert ist. – Stiggler