1

onclickからのクエリの後に設定されるloggedInブール値を持つAdminBeanがあります。

    <h:commandButton rendered="#{!adminBean.loggedIn}" styleClass="moreButtonAsText" id="adminLoginAsText" value="Login" action="#{adminBean.logIn}">
      <f:ajax render="detailsBox adminForm" execute="@form" onevent="onevent"/>
    </h:commandButton>

  </h:form>
</div>

<script type="text/javascript">
  function onevent(e){
    if(e.status=='success') {
      alert(#{adminBean.loggedIn});
    } 
    if(e.status=='complete') {
      alert(#{adminBean.loggedIn});
    } 
  }
</script>

ユーザーが正常にログインしたかどうかに基づいて別のJavaScriptを実行したいので、これが必要です。コマンドボタンは最初に(明らかに)クリックされ、次にログインがtrueに設定されます。私はこれをAdminBeanクラスに明示的に持っています:

public boolean isLoggedIn() {
    System.out.println(loggedIn);
    return loggedIn;
}

もともと私はoneventをすべてのようonevent="#{adminBean.loggedIn} ? yesFunction : noFunctionにネストしていましたが、これは機能しませんでした。 だから私は周りを読んで http://fyhao.com/2010/05/computer-and-it/java/java-server-faces/jsf-2-fajax-why-execute-onevent-three-times/を見つけましたそれをインライン関数に分割することにしましたが、それでも機能しませんでした。
次に、JavaScriptが値をどのように考えているかについての明確なアラートステートメント(およびそれらが同意するかどうかを確認するための私の印刷ライン...)を除いて、上記で投稿したものを使用することにしました。

Javaコンソールは、最初のアラート(つまりe.status=='complete')によって、最初に多くのfalseを出力し、次に多くのtrueを出力します。
JavaScriptはfalseを警告します。

次に、コンソールをクリアして、アラートの[OK]をクリックします。その後、コンソールは何も出力せず、2番目のアラートが呼び出されますが、それでもfalseです。だから私のJavaScriptは失敗します。

今私が気付いたもう1つの奇妙なこと...AdminBeanはセッションスコープです。アドレスバーでもう一度Enterキーを押すと、何をしてもJavaScriptはtrueと警告します...レンダリングは正常に機能します(JavaScriptが警告しても、ログイン時にのみレンダリングする必要があるものは表示されませんtrue)。

一体何が起こっているのですか?

さらに情報/コードが必要な場合は、お問い合わせください。

編集#1:

私が試したと上で言ったときonevent="#{adminBean.loggedIn} ? yesFunction : noFunction、私も試しonevent="#{adminBean.loggedIn} ? yesFunction : noFunctionました。これらの関数の引用符/アポストロフィが欠落している可能性があることに気付きましたが、その問題を解決する前に、adminBean.loggedInの問題を修正したいと思います。

編集#2:

選択した回答を参照してください。私はこの解決策に取り組んでいましたが、答えは基本的に私の結果を確認しました。

<h:form id="javascriptHack">
  <h:form id="hiddenJS" rendered="#{adminBean.loggedIn}" >
    <script type="text/javascript">
      $(function() {
        (#{adminBean.loggedIn}) ? slowCloseAdminPanel() : adminPanelLeftOpen();
      });
    </script>
  </h:form>
</h:form>

これはハックな方法かもしれませんが、機能します。

4

1 に答える 1

2

これは、ajaxリクエストがスクリプトを更新しないためです。それはまだ初期値を保持します。スクリプトを中に入れることができます<h:form>。これは機能するはずです。

于 2012-04-19T11:19:04.393 に答える