2011-11-15 14 views
1

遅延バインディングに奇妙な問題があります。 usercategoryという名前のCookieの値を見て、プロパティを設定しますusercategory遅延バインディングがコンパイル後に機能しない

<?xml version="1.0" encoding="UTF-8"?> 

<!-- Defines the usercategory property and its provider function. --> 
<module> 

    <define-property name="usercategory" values="c00,c01,c02" /> 
    <collapse-property name="usercategory" values="*" /> 

    <property-provider name="usercategory"><![CDATA[ 
     // Look for the usercategory cookie 
     var cs = document.cookie.split(';'); 
     for (var i = 0; i < cs.length; i++) { 
      var name = cs[i].substr(0, cs[i].indexOf("=")); 
      var value = cs[i].substr(cs[i].indexOf("=") + 1); 
      name = name.replace(/^\s+|\s+$/g,""); 
      if (name == "usercategory") { 
       return unescape(value); 
      } 
     } 

     return "c00"; 
    ]]></property-provider> 

</module> 

:私は、次のモジュールを定義しています。

は、私には、例えば、いくつかのクラスの結合を延期するために、このプロパティapplication.gwt.xmlを使用します。

<inherits name="com.example.UserCategory"/> 

<replace-with class="com.example.client.ui.menu.MainMenuView01"> 
    <when-type-is class="com.example.client.ui.menu.MainMenuView"/> 
    <when-property-is name="usercategory" value="c01"/> 
</replace-with> 

私は(開発モードにいるとき、これは魔法のように動作すなわち内から私のアプリを実行しているときEclipse)。しかし、私がアプリケーションをコンパイルして(Jettyでは、これは問題ではありませんが)、デプロイされたバインディングが機能していないように見え、期待されるクラスがロードされません。私はチェックして、正しい値c01でクッキーが正しく設定されていますが、クラスcom.example.client.ui.menu.MainMenuView01はロードされていません。

何か不足していますか?私は何か間違っているのですか?

ありがとうございます!

+0

何が起きているのかを見るために、デバッグ文をプロパティプロバイダに配置しようとしましたか?いくつかの値を解析して出力するために 'console.log'と同じですか? – Strelok

+0

私はそれを試みました。私が期待するように、 'console.log'のメッセージが出てきますが、アプリケーションが期待通りに動作しません:' com.example.client.ui.menu.MainMenuView01'がロードされていません。しかし、私は、ブラウザのリロードボタンをクリックすると、すべて正常に動作することに気がつきました。なぜか分かりません。とにかく、私はユーザにリロードをクリックするように要求することはできません:( – MarcoS

答えて

0

から読み取ることができないかもしれないということです

(および使用ではなく、ウィンドウのプロパティプロバイダに$ DOCと$ WNDをvarsの)あなたの財産プロバイダをデバッグしよう何が問題なのか、そして他の人が興味を持っているかもしれない場合に備えてここに書いています。

私が定義したモジュール(私の質問のコードを参照)は、ユーザーがアプリケーションにログインした後に生成されるクッキーから取得される値を持つプロパティを定義します。

私はログインのためにもともとGWT Placeを持っていました。ユーザが正常に認証されたとき、アプリケーションは別の場所に移動しました。この場合、ユーザーがアプリケーションを入力し、GWT Javascriptがブラウザにダウンロードされると、Cookieはまだ設定されていません(ユーザーはまだログインしていないため)。したがって、遅延バインディングは機能せず、期待されるクラス(com.example.client.ui.menu.MainMenuView01など)はロードされません。

開発モードで実行すると、なぜこれが正しく動作するのかわかりません。とにかく。私が実装したソリューションは、ログインフェーズをGWTアプリケーションの外に移動することです。ログインが成功すると、Cookieを追加し、実際のGWTアプリケーションにユーザーをリダイレクトします。

0

2つの可能性があります。あなたは何か間違っているか、GWTコンパイラに別のバグがあります。私はあなたのようなケースを実装しようとしましたが、問題なくコンパイルされたときに動作していました。だからあなたの側に何らかのエラーがある可能性が最も高いです。だから、私は何をすることをお勧めする - スタイルのPRETTYでアプリケーションをコンパイルし、どのようにコンパイルされた参照してください。 com_example_client_ui_menu_MainMenuView()という名前の関数を見つけて、MainMenuView01を作成してデバッグしようとしているかどうかを確認してください。とにかくこの種のものは問題なく動作するはずです。

また別の可能性のある場合は、クッキーは、私は考え出しJS

+0

私は何か間違っているかもしれませんが、開発モードで実行したときに同じコードが正しく動作するのはなぜですか? – MarcoS

+0

あなたのコードはないので、 GWT.isScript()からプロダクションとローカル環境で返されるデータの違い(例えば、アプリケーションフローがいくつかのプロダクション設定のために異なる可能性があるため、GWT.cのsoft順列は ' tも呼び出されました)いくつかのコンパイラのグリッチも可能です(私はGWTコンパイラがいくつかの有用なコードを取り除いたときに遭遇しました)コンパイルされたアプリケーションをデバッグして問題が実際に遅延バインディングであるかどうか調べてみてください – jusio

+0

デバッグしようとしています私は、ブラウザのリロードボタンをクリックすると、すべて正常に動作することに気がつきました...なぜか分かりません。とにかく、私はリロードをクリックするように私のユーザに頼むことはできません – MarcoS

関連する問題