0

GWT は初めてですが、今のところ気に入っています。再現しやすい問題があります。PubNub 用の GWT モジュール (内部で使用するユーティリティ) を作成したいので、これは大きな問題です。

カプセル化をテストするデモ プロジェクトを作成したところ、ScriptInjector/Pubnub に関する興味深い問題が見つかりました。

最初は、PubNub の指示に従いました。注: テスト アカウント用のキーを含めました。それらを自由に使用してください。

指示に従って、これら 2 つの項目を GWT プロジェクトの html ファイルに入れます (キーを指定して):

<div pub-key="pub-b8b75fbd-c4cf-4583-bab9-424af7a7f755" sub-key="sub-5e843c94-1193-11e2-bba9-b116c93082cf" ssl="off" origin="pubsub.pubnub.com" id="pubnub"></div>
<script src="http://cdn.pubnub.com/pubnub-3.1.min.js"></script>

これを行うと、JSNI を使用して pubnub にアクセスできます。それはすべてうまくいきます。

ここでタグを削除し、代わりに次のコードでスクリプトを挿入するとうまくいきません。成功メッセージが表示され、Chrome の開発者ツールでスクリプトが表示されるため、スクリプトが挿入されることがわかります。

          ScriptInjector.fromUrl("http://cdn.pubnub.com/pubnub-3.1.js").setCallback(
                  new Callback<Void, Exception>() {
                     public void onFailure(Exception reason) {
                       Window.alert("Script load failed.");
                     }
                     public void onSuccess(Void result) {
                       Window.alert("Script load success.");
                     }
                  }).inject();

これは、遅延スクリプトを使用して DOM にアクセスすることに何らかの形で関連しているに違いないと思います。または、スクリプトが DOM の一部ではないためです。setup divにアクセスしようとしていますが、できません...(私の推測です)

何かご意見は?他の大きなプロジェクトで使用するためにこのプロジェクトをモジュール化する必要があるため、アイテムを html ファイルから移動する必要があります。どんな助けでも大歓迎です。

(PS、html ウィジェットも作成して EntryPoint に追加しようとしました。これにより、Chrome の開発者ツールでのブラウジングに基づいてページにタグが追加されますが、ScriptInjector が失敗するのと同じように機能しません。)

編集:これは、問題をデモするために作成できるのと同じくらい簡単なプロジェクトです:

html ファイル:

body 終了タグの上:

<div pub-key="pub-b8b75fbd-c4cf-4583-bab9-424af7a7f755" sub-key="sub-5e843c94-1193-11e2-bba9-b116c93082cf" ssl="off" origin="pubsub.pubnub.com" id="pubnub"></div>
<script src="http://cdn.pubnub.com/pubnub-3.1.min.js"></script>
<script src="pubnubWrapper.js"></script>

pubnubWrapper.js (基本的には pubnub Web サイトにあるもの):

function subToPubNub(){
    PUBNUB.subscribe({
        channel    : "hello_world",      // CONNECT TO THIS CHANNEL.
 
        restore    : false,              // STAY CONNECTED, EVEN WHEN BROWSER IS CLOSED
                                         // OR WHEN PAGE CHANGES.
 
        callback   : function(message) { // RECEIVED A MESSAGE.
            alert(message);
        },
 
        disconnect : function() {        // LOST CONNECTION.
            alert(
                "Connection Lost." +
                "Will auto-reconnect when Online."
            )
        },
 
        reconnect  : function() {        // CONNECTION RESTORED.
            alert("And we're Back!")
        },
 
        connect    : function() {        // CONNECTION ESTABLISHED.
 
            PUBNUB.publish({             // SEND A MESSAGE.
                channel : "hello_world",
                message : "Hi from PubNub."
            })
 
        }
    })
}

ScriptTest.java:

public class ScriptTest implements EntryPoint {
    public void onModuleLoad() {
        //add a button to sub to pubnub
        Button subButton = new Button("Sub");
        //add the event handler for button
        subButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                //sub to pubnub
              callSub();
            }
          });
        RootPanel.get().add(subButton);
    }
    public native void callSub() /*-{
        //call my wrapper to pubnub
        $wnd.subToPubNub();
    }-*/;
}

これはすべてそのまま機能します。

html ファイルから pubnub スクリプトを削除し、スクリプト インジェクターで追加すると失敗します。スクリプトを gwt.xml ファイルに追加すると、失敗します。

何か案は?

4

1 に答える 1

0

JSNIコードを投稿できますか?
変数を介してPubNubにアクセスしていると思います$wndか?
モジュールのxmlファイルにスクリプトタグを配置すると、pubnubコードがホストのページウィンドウに読み込まれます(Chrome DeveloperToolsで確認できます)。

ScriptInjectorデフォルトではロードされませんが、GWT名前空間にロードされます。したがって、それをホストのウィンドウ名前空間にロードするには、をに渡す必要がありますTOP_WINDOWScriptInjector

ScriptInjector.fromUrl("http://cdn.pubnub.com/pubnub-3.1.js").setCallback(
    new Callback<Void, Exception>() {
        public void onFailure(Exception reason) {
            Window.alert("Script load failed.");
        }
        public void onSuccess(Void result) {
            Window.alert("Script load success.");
        }
}).setWindow(ScriptInjector.TOP_WINDOW).inject();
于 2012-10-11T06:52:50.870 に答える