8

GWT MVP と UiBinder を使用して、DockLayoutPanel でアプリを作成しています。ボタンとリンクを含む、北と南のドックを静的にしたい。中央と東ドックの 2 つの異なるエリアで動的なビューを表示したいと考えています。これらの動的領域は互いに独立している必要があるため、動的表示領域ごとに異なる ActivityMapper と ActivityManager を設定しています。中央、東上、東下。

アプリケーションのロード時にこれら 3 つの異なる表示領域を個別に初期化するにはどうすればよいですか? 他の領域に影響を与えずに、ある表示領域であるアクティビティから別のアクティビティに切り替えるにはどうすればよいですか?

PlaceController の goTo を使用してある場所から別の場所に切り替えると、他の領域のアクティビティが停止します。

メーデー、助けてください、メーデー!

以下は私のコードの一部です:

AppViewImpl.ui.xml

<g:DockLayoutPanel styleName="{style.dockPanel}" unit="PX" width="975px" height="100%">

    <!-- DOCK PANEL EAST -->
    <g:east size="220">
        <g:LayoutPanel styleName="{style.eastPanel}">
            <g:layer left="0px" width="220px" top="0px" height="105px">
                <g:SimpleLayoutPanel ui:field="topRightPanel"/>
            </g:layer>

            <g:layer left="0px" width="220px" top="110px" height="340px">
                    <g:InlineLabel styleName="{style.label}" text="ANOTHER DISPLAY AREA"/>
            </g:layer>
        </g:LayoutPanel>
    </g:east>

    <!-- DOCK PANEL NORTH -->
    <g:north size="110">
        <g:LayoutPanel styleName="{style.northPanel}">
            <g:layer left="0px" width="755px" top="0px" height="105px">
                    <g:InlineLabel styleName="{style.label}" text="NORTH PANEL"/>
            </g:layer>
        </g:LayoutPanel>
    </g:north>

    <!-- DOCK PANEL SOUTH -->
    <g:south size="20">
        <g:LayoutPanel styleName="{style.southPanel}">
            <g:layer left="0px" width="755px" top="0px" height="20px">
                    <g:InlineLabel styleName="{style.label}" text="SOUTH PANEL"/>
            </g:layer>
        </g:LayoutPanel>
    </g:south>

    <!-- DOCK PANEL CENTER -->
    <g:center>
        <g:SimpleLayoutPanel ui:field="mainPanel" />
    </g:center>
</g:DockLayoutPanel>

MyModule.java

public class MyModule は EntryPoint を実装します {

private Place defaultPlace = new DefaultPlace("");

public void onModuleLoad() {
    // Create ClientFactory using deferred binding so we can replace with 
    // different impls in gwt.xml
    ClientFactory clientFactory = GWT.create(ClientFactory.class);
    EventBus eventBus = clientFactory.getEventBus();
    PlaceController placeController = clientFactory.getPlaceController();

    // Start ActivityManager for the main widget with our ActivityMapper
    ActivityMapper topRightActivityMapper = new TopRightActivityMapper(clientFactory);
    ActivityManager topRightActivityManager = new ActivityManager(topRightActivityMapper, eventBus);
    topRightActivityManager.setDisplay(clientFactory.getAppView().getTopRightPanel());

    // Start ActivityManager for the main widget with our ActivityMapper
    ActivityMapper mainActivityMapper = new AppActivityMapper(clientFactory);
    ActivityManager mainActivityManager = new ActivityManager(mainActivityMapper, eventBus);
    mainActivityManager.setDisplay(clientFactory.getAppView().getMainPanel());

    // Start PlaceHistoryHandler with our PlaceHistoryMapper
    AppPlaceHistoryMapper historyMapper = GWT .create(AppPlaceHistoryMapper.class);
    PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper);
    historyHandler.register(placeController, eventBus, defaultPlace);
    RootLayoutPanel.get().add(clientFactory.getAppView());

    // Goes to place represented on URL or default place
    historyHandler.handleCurrentHistory();

    new AppController(clientFactory);
}

}

AppController.java

public class AppController implements AppView.Presenter {

    private ClientFactory clientFactory;

    AppController(ClientFactory clientFactory){
        this.clientFactory = clientFactory;
        goTo(new TopRightAPlace(""));
    }

    @Override
    public void goTo(Place place) {
        clientFactory.getPlaceController().goTo(place);
    }

}

TopRightAViewImpl.java

public class TopRightAViewImpl extends Composite implements TopRightAView {

    interface Binder extends UiBinder<Widget, TopRightAViewImpl> {
    }

    private static final Binder binder = GWT.create(Binder.class);

    private Presenter listener;
    @UiField
    Button button;

    public TopRightAViewImpl() {
        initWidget(binder.createAndBindUi(this));
    }

    @Override
    public void setName(String name) {
        button.setHTML(name);
    }

    @Override
    public void setPresenter(Presenter listener) {
        this.listener = listener;
    }

    @UiHandler("button")
    void onButtonClick(ClickEvent event) {
        listener.goTo(some other place);
    }
}
4

2 に答える 2

7

GWT PlacePlaceController、およびPlaceHistoryMapperを使用すると、アプリケーション内でブックマーク可能な URL を作成できます。これにより、ブラウザーの [戻る] ボタンとブックマークが期待どおりに機能します。これが GWTPlaceの設計目的です。Placeしたがって、アプリケーション全体で 1 つの URL を使用するため、任意の時点でアプリケーションで複数の URL をアクティブにすることは意味がありません。

PlaceControllergoTo()メソッドは登録済みの に通知しActivityManager、PlaceChangeEvent を受け取ると現在のアクティビティを停止します。

あなたへの私の提案は、 の東側の 2 つのエリアにPlaces とs を使用しないことです。アプリケーションのメイン画面には s を使用します。おそらく. 更新が必要な場合は、東側のエリアに対して、汎用イベント タイプ (例: ) またはカスタム イベント タイプのいずれかのさまざまなタイプを起動します。東側に s を使用することもできますが、独自の を作成する必要がありますが、実際にはそれほど難しくありません。GWT の をコピーして名前を変更し、およびを処理するメソッドの名前を独自のイベントを処理するものに置き換えるだけです。PlaceChangeEventDockLayoutPanelPlaceDockLayoutPanelGwtEventValueChangeEventActivitieActivityManagerActivityManagerPlaceChangeEventPlaceChangeRequestEvent

于 2011-11-25T22:17:58.507 に答える
1

本当に Google の mvp 実装を使用しますか? mvp4gを使用してこのメ​​カニズムを実装するのは非常に簡単です。メイン モジュールは、メイン ビューを初期化し、動的領域をリロードするロジックを提供します。私はこのフレームワークを 2 つの大きなプロジェクトで使用しましたが、魅力的に機能します。

于 2011-11-24T09:46:26.140 に答える