0

1つの場所と1つのアクティビティを使用する単純なGWTアプリを実装しました(これAbstractActivityは、Composite「ビュー」サブクラスを拡張し、含むプレゼンターとして実装しました)。ビュー内の唯一の UI オブジェクトは、「ホームページ」の一番上に表示したいGWT-Bootstrap NavBarです。

Eclipse 内からローカルでアプリを実行していますが、コンパイラ エラーやランタイム エラーは発生しません。開発モードコンソールが示す URL に移動すると、ブラウザが少し停止し (ブラウザが JavaScript を「ダウンロード」していると想定します)、(NavBar の代わりに) 空白の白い画面が表示されます。 . ウィンドウのタイトルは正しく (モジュールの HTML ページでこれを設定しました)、ソースを表示すると同じ HTML ソースが表示されるので、アプリの JavaScript がブラウザーに適切に到達していることがわかります。NavBar をレンダリングしていないだけです。

、 my default 、、、 presenter 、および viewにSystem.out.println()ステートメントを散りばめました。これらのステートメントはすべて開発コンソールに出力されます。すべてを正しく配線したこと、および実行時にメソッドが呼び出されたときに (内部から)、NavBar が表示されるはずであることを教えてくれます。onModuleLoad()ActivityManagerActivityMapperPlaceHistoryMapperCompositesysoutPlaceHistoryHandler#handleCurrentHistoryonModuleLoad

私が考えることができる唯一の可能性は次のとおりです。

  1. 構成gwt-bootstrapが正しくありません。また
  2. UiBinder を正しく使用していません
  3. RootLayoutPanelアクティビティと場所の使用方法、または UI をinsideにアタッチする方法に何か問題がありますonModuleLoad()

に関してはgwt-bootstrap

  • プロジェクトのクラスパスに JAR を配置しました (ウィジェット/ビュー内に新しいUiFieldタイプを含めるNavBarと、コンパイラ エラーが発生しないため、これはわかっています)
  • <inherits name="com.github.gwtbootstrap.Bootstrap"/>GWT モジュール XMLに追加しました

他に何か設定する必要がある場合は、お知らせください。

UiBinder に関しては、ここに私のウィジェット/ビューがあります:

public class WebRootDisplay extends BaseDisplay {

    private static WebRootDisplayUiBinder uiBinder = GWT
        .create(WebRootDisplayUiBinder.class);

    interface WebRootDisplayUiBinder extends UiBinder<Widget, WebRootDisplay> {
    }

    @UiField
    Navbar navBar;

    public WebRootDisplay(EventBus eventBus) {
        super(eventBus);

        System.out.println("I get this printing to the console at runtime.");

        initWidget(uiBinder.createAndBindUi(this));

        System.out.println("...and this too!");
    }
}

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui"
    xmlns:b="urn:import:com.github.gwtbootstrap.client.ui">
    <g:HTMLPanel>
        <b:Navbar ui:field="navBar">
            <b:Nav>
                <b:NavLink href="http://www.google.com">
                    Home
                </b:NavLink>
            </b:Nav>
        </b:Navbar>
    </g:HTMLPanel>
</ui:UiBinder>

私が気づいたことの 1 つは、UiBinder XML に自分のNavBar内部があることです。HTMLPanel私がこれを行ったのは、Google-Eclipse プラグインを使用して新しい UiBinder を生成したためです (これは、UiBinder スニペットと同様Compositeに (私は extend に変更しBaseDisplay、それ自体 extends ) の両方を自動生成しました)。Compositeこの内部の UI フィールドHTMLPanel...(?)

ここで何か不足している場合はお知らせください。私はそれが私のために何をするかを信じNavBarているので、フィールドをインスタンス化していません。createAndBindUi

gwt-bootstrap構成と UiBinder の使用の両方が正しいように見える場合は、明らかに他の何かが間違っているため、さらにコードを投稿する必要があります。これらの最初の2つの項目が除外される前に、最初はそれを保留したかっただけです. 前もって感謝します!

アップデート

ここにあるonModuleLoad

public void onModuleLoad() {
    // Some homegrown DI stuff. I have verified that the injector works properly.
    ApplicationScope appScope = new ApplicationScope();

    setInjector(new ApplicationInjector(appScope,
        InjectorProvider.newMasterProvider()));

    // Add the sole composite child to the RootLayoutPanel.
    // I have verified that injectWebRootDisplay returns a fully configured
    // WebRootDisplay instance.
    RootLayoutPanel.get().add(injector.injectWebRootDisplay());

    historyHandler.register(placeController, eventBus, defaultPlace);
    historyHandler.handleCurrentHistory();
}
4

4 に答える 4

0

さて、私はあなたのコードとまったく同じように見えるローカルの例を試しましたが、問題は UI バインダーにはないと思います。これまでに提供したコードは正しいため、エラーは別の場所にある可能性が最も高いです。

最大の容疑者はBaseDisplayクラスです。私が見る限り、このクラスは GWT または gwt-bootstrap のものではありません。クラスを変更することで、非常に迅速に確認できるため、代わりにWebRootDisplayクラシックGWTクラスを拡張します(しばらくの間、すべてのmvpを無効にします)。動作する場合は、問題の原因が「BaseDisplay」であることを証明できます。CompositeBaseDisplay

私は完全なコードを持っていないので、それがWebRootDisplayビューの表示にも使用されていると想定することしかできません。おそらくエラーは、ビューがそのクラスに追加されたときに、以前にウィジェットを追加したことです(あなたの場合、それは NavBar ですのコンストラクターに追加するWebRootDisplay) は削除されます。ほとんどの場合、問題はメソッドsetWidgetinitWidget

于 2012-11-25T22:37:07.593 に答える
0

GWT のアクティビティと場所に関する私の経験では、空白の白いページの一般的な原因は、場所の Tokenizer を PlaceHistoryMapper に登録できていないことです。

/**
 * PlaceHistoryMapper interface is used to attach all places which the
 * PlaceHistoryHandler should be aware of. This is done via the @WithTokenizers
 * annotation or by extending PlaceHistoryMapperWithFactory and creating a
 * separate TokenizerFactory.
 */
@WithTokenizers({
    MyPlace.Tokenizer.class,
    SomeOtherPlace.Tokenizer.class})
public interface AppPlaceHistoryMapper extends PlaceHistoryMapper {}

https://developers.google.com/web-toolkit/doc/latest/DevGuideMvpActivitiesAndPlaces#PlaceHistoryMapperを参照してください

白いページの別の原因 (特に、単一の場所で RootLayoutPanel.get() を使用する場合) は、ActivityMapper で場所を正しくマッピングできません。

/**
 * AppActivityMapper associates each Place with its corresponding
 * {@link Activity}
 * 
 * @param clientFactory
 *            Factory to be passed to activities
 */
public class AppActivityMapper implements ActivityMapper {
    private ClientFactory clientFactory;

    public AppActivityMapper(ClientFactory clientFactory) {
        super();
        this.clientFactory = clientFactory;
    }

    @Override
    public Activity getActivity(Place place) {
        if (place instanceof MyPlace)
            return new MyActivity((MyPlace) place, clientFactory);
        else if (place instanceof SomeOtherPlace)
            return new SomeOtherActivity((SomeOtherPlace) place, clientFactory);

        return null; // If your return null with single place bound to RootLayoutPanel
        // you may get a blank white page
    }
}

https://developers.google.com/web-toolkit/doc/latest/DevGuideMvpActivitiesAndPlaces#ActivityMapperを参照してください

より完全なコード サンプルがなければ、何が起こっているのかを正確に判断することはできませんが、上記の 2 つの原因は一般的な見落としであり、このスレッドに出くわしたすべての人に役立つ可能性があります。

于 2013-03-18T20:39:58.553 に答える
0

onModuleLoad()コードの一部を貼り付けていただけますか?

エラー メッセージが表示されないException場合は、ビューを に適切に追加したことを確認するかRootPanel、アプリを実行するときに、 がにあり、表示されていないか、または同様のものであることを確認する必要viewがあります。divHTML

パーツはUiBinder一見問題ないように見えます。

編集: これonModuleLoad()は私にはあまり言いませんが、何かを試すことができます. 私は常に RootLayoutPanel.get() メソッドを次のように使用します。

RootLayoutPanel.get("someDivId").add(injector.injectWebRootDisplay());

そのため、常にdivortableをプレースホルダーに追加しHTMLid、RootPanel を取得するときにその div を参照できるようにします。これが必要かどうかは確信が持てませんが、これは初めて見ましたが、適切に機能しています。質問や問題がある場合は、お知らせください。:)

于 2012-11-24T14:59:04.917 に答える
-1

System.println の代わりに GWT.log メッセージを使用します。次に、(Firebug または Chrome の) Javascript コンソールを開き、コードの最終的な場所を確認します。GWT.log はブラウザー コンソールに出力されるため、コンパイルされた JS コードが何を行うかを確認できます。

また、Pretty モードでコンパイルすると、生成された Javascript コードがブラウザーに表示され、ステップスルーして何が呼び出されているか (または呼び出されていないか) を確認できます。

于 2012-11-25T15:41:18.413 に答える