2012-04-19 2 views
0

を読んでいない私はonclickのからの問い合わせの後に設定されてLOGGEDINブールを持ってAdminBeanありますJSFのF:アヤックスのonEventがBean値

<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が値を考えていることについての明確な警告文を除いて、上に掲載したものに進むことにしました(そして、私のプリントラインが同意するかどうかを確認する...)。最初のアラート(e.status=='complete')は、最初はたくさんの偽物を印刷し、その後多くの真実をプリントします。
JavaScriptアラートはfalseです。

コンソールをクリアし、アラートの[OK]をクリックします。その後、コンソールにはは表示されず、と表示され、2番目のアラートはまだ偽と呼ばれます。私のJavaScriptは失敗します。

私が気づいたもう1つの奇妙なことは... AdminBeanはセッションスコープです。アドレスバーのEnterキーをもう一度押すと、JavaScriptが本当に警告されます...たとえレンダリングが正常に機能していても(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> 

これはやっかいな方法かもしれませんが、機能します。

答えて

1

これは、あなたのajaxリクエストがスクリプトを更新しないためです。それでも、初期値は保持されます。あなたは<h:form>の中にスクリプトを置くことができます。これはうまくいくはずです。

+0

元は、私はf:ajax内にあった 'onevent ="#{adminBean.loggedIn}?first:second "を持っていて、内部にあるフォームを再描画しています。なぜそれがうまくいかないのか分かりません。しかし...私は仕事をしていましたが、今ではあなたが(私があなたのコメントを見た前に)お勧めしたものをテストしています。ソリューションを投稿するコードを編集します。最初の方法はなぜ機能しませんでしたか? – twmb

関連する問題