0


0

現在は、Presentation Modelパターンを使用してFlex / PHPプロジェクトのクライアント側を構築しています。

*達成しようとしていること:*現在、Nodeというドメインオブジェクトに関する編集不可能な情報を表示するビューがあります。 ノードが編集可能でユーザーが適切な権限を持っているかどうかに応じて、このオブジェクトに変更を加えることが可能な場所で追加のビューが利用可能になります。 ユーザーが「変更を保存」を選択すると、加えられた変更はサーバーにのみコミットされます。 NodeAに変更が加えられ、ユーザーがそれらを保存せずに別のNodeBにナビゲートすると、NodeAは元の状態に戻ります。

*設計:*現在のノードへの参照を保持する情報ビューのPMがあります。 編集ビューのPMは、この情報PMから拡張され、ラップされたNodeオブジェクトに変更を加えるためのメソッドが追加されています。 両方のPMに同じノード参照が挿入されており、情報/編集ビューのすべてのフィールドは、それらのPMを介してノードにバインドされています。

*問題:*ユーザがNodeAに変更を加えてもコミットしない場合、元の状態に戻すための洗練された解決策を考えることはできません。 基本的に、私がこれまで考えてきたことは編集PM上に別々の値のコピーを保持することです、新しいNode参照をクローン作成するか、または同じNodeプロパティのセットを通して。 この2つのうち、前者はノードがドメインロジックをすでに収容しているのでより良い考えのように思えますが、たとえそれが限られた範囲で使われたとしても、ユニークドメインオブジェクトのクローンを作成することは悪い習慣であるかどうか疑問に思います。

2 Answer


1


元のデータをValue Object( "VO")のXMLプロパティに格納することで同様のケースを処理し、VOが必要になったときに他のすべてのプロパティ値をリセットします。

したがって、最初に表示する必要があるときに、XMLを取得します。

値値値

XMLを取得するときに、結果ハンドラーで最初に行うことは、自分のVOのインスタンスを作成し、XMLプロパティを設定してから、別のクラスでパブリック関数を呼び出してVOのプロパティを設定することです。

プライベート関数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クラス自体のどちらにでも維持することができます。


0


各ビューは、自分のPresentation Modelクラスの独自のインスタンスを持つ必要があります。 ユーザーが別のビューに移動したときに保存していない場合は、メモリに保存してください。 クローニングは、より複雑なプロセスを通じて基本的に同じことを実現します。