2012-01-30 6 views
2

私はGWTを2列表示しています。左の列には、アプリケーション内のユーザーのリストを含むCellTableが含まれています。ユーザーがリストからユーザーを選択すると、右の列にはユーザーが編集できる選択されたユーザーの詳細が表示されます。GWT Activity.mayStop()から「キャンセル」を選択してください。

Activity私はmayStop()メソッドを使用していますので、ユーザーを切り替える前に、システムはユーザーが行った保存されていない変更を保存しようとします(検証エラーがない限り)。

私の質問は、検証エラーがある場合の動作についてです。保存されていない編集内容を破棄したり、ページに戻って問題を修正するようにユーザーに依頼しています。私の問題は、ユーザーがキャンセルして(エラーを返して修正する)キャンセルを押すと、詳細テーブルの列にあるユーザーを選択せず​​に、セルテーブルが新しいユーザーを選択しているということです。ユーザーアクティビティからの切り替えはキャンセルされましたが、GWTはまだCellTableの選択を行っています。 「キャンセル」選択をキャプチャする方法、またはセルテーブルの選択を停止する方法はありますか?

+0

実際のコードを出していないので具体的には示唆しにくいですが、 'CellTable'に付随する' SelectionModel'を拡張して 'setSelected(...)'メソッドをオーバーライドできます特定のフラグがどこかに設定されている場合は、 'super.setSelected(...)'を呼び出すことができます。繰り返しますが、具体的なことがなくても何かを示唆するのは難しいですが、それはあなたが探ることのできる方向です。 – Strelok

答えて

4

最終的にmayStop()onStop()という呼び出しをトリガするPlaceControllerのソースを見ると、2つの異なるイベントが1つずつ呼び出されます。 PlaceChangeRequestEventが先に進み、変更が要求されていますが、まだ完了していないことを示します(予測可能)。これにより、mayStop()が呼び出されます。

変更をキャンセルしないと、PlaceChangeEventが呼び出され、onStop()が呼び出されます。それ以外の場合、これは決して呼び出されません。

私のアプローチは、これらのイベントに基づいて左の列に実際の選択を基にすることです。選択を中止/キャンセルする便利な方法はないので、実際に選択を管理し、ユーザーがフィードバックを提供した後にその選択を遅らせるのは良い方法ではありません。

  • ユーザーがクリックしたときに実際には選択しないで、場所の変更に影響を与えます。その後、PlaceChangeEventが実行されたら、実際に選択します。私は選択をキャンセルする便利な方法がないので、これはやや粗雑です。または
  • ユーザーが(場所ではなく)選択を変更した後、最後に選択した要素を追跡します。 PlaceChangeRequestEventを聞き、その元のアイテムを選択するために遅延コマンドをスケジュールし、そのコマンドの本体をスキップするためにPlaceChangeEventを待ち受けます。ユーザーに提示された警告がブロックされているので、これはうまくいくはずです。実際にはテストしていません。

場所の変更がURLに配線されている場合は、ユーザーがブラウザの[進む/戻る]ボタンをクリックするのを見るために既にPlaceChangeEventハンドラが必要です。場所の変更は選択をドライブする必要がありますが、場所を移動する必要がありますが、ユーザーがクリックして場所の変更を取り消すと、セルテーブルは元の選択を維持する必要があります。

0

これまで、いくつかのソースからの入力に基づいてこれを実装しました。ここで私は私のために働いた思いついたものです。

あなたのセルウィジェット内のすべての細胞は(handlesSelectionのためにtrueを返すようにオーバーライドする必要がある)、このように:

/** 
* This text cell is designed for use in cell widgets that are tied to Places 
* and thus need to have the Activity/Presenter manage the selection to allow 
* for a mayStop() rejection of the navigation (user clicks cancel at prompt). 
*/ 
public class PlaceTextCell extends TextCell 
{ 
    @Override 
    public boolean handlesSelection() 
    { 
     // So that the selection model won't change the selection automatically. 
     return true; 
    } 
} 

次に、あなたが選択が起こる前に発生CellPreviewEvent(を経由して選択イベントを処理する必要が、SelectionChangeEventとは異なります)。私はDataGridを使用しましたが、これはCellTableでも動作するはずです。

selectionDataGrid.addCellPreviewHandler(new CellPreviewEvent.Handler<Dto>() { 
    @Override 
    public void onCellPreview(CellPreviewEvent<Dto> event) { 
     if(Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK || 
     event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) 
      { 
      eventBus.fireEvent(new MySelectionChangeRequestEvent(event.getValue())); 
     } 
    } 
}); 

これは、PlaceController()。goTo()を呼び出す場所変更要求イベントを発生させます。これにより、アクティビティのmayStop()のチェックがトリガーされます。次に、あなたのアクティビティはその相互作用を処理する必要があります。

私の場合は、シングルトンのプレゼンターがいます。そこで私は発表者に新しい場所について話します。この呼び出しによって、対応する行を選択するビューが更新されます。

はまた、私はまだselectionModelのが正常に動作します:この新しい行が選択されているので、後

selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { 
    public void onSelectionChange(SelectionChangeEvent event) { 
     eventBus.fireEvent(new MySelectionChangeEvent(selectionModel.getSelectedObject())); 
    } 
}); 

、別のイベントが新しい選択に基づいてUIの別の部分を更新するために発射されます。

  • 「ユーザーがクリックすると実際には選択しない」は、 カスタムセルオーバーライドによって処理されます。
  • "場所の変更に影響を与える"部分は、CellPreviewHandlerとPlaceController.goTo(Place)によって処理されます。
  • 残りは、アクティビティとプレイスの実装だけで処理されます。
関連する問題