イベントハンドラーではなくビューのルートイベントで実行すると、context.redirectToPage の動作が異なるのはなぜですか?
この質問は、ユーザーがログインした後、xpages アプリケーションの言語をユーザー プロファイルに保存されている言語に設定しようとしたときに発生しました。リソース バンドル内の翻訳された文字列を含むプロパティ ファイルを使用し、次のような文字列を取得します。これ:
<xp:text value="${langString['WELCOME_TEXT']}" />
言語が変更され、別のプロパティ ファイルが読み込まれると、それらの文字列を更新するためにページを更新する必要があります。サーバー側のcontext.redirectToPage()を実行するフルリフレッシュイベントハンドラーをログインボタンに追加すると、これはうまくいきました。location.reload や window.location.href=window.location.href のようなクライアント側の更新ではうまくいきません (ただし、ログイン関数自体はクライアント側の関数です)。
しかしもちろん、ユーザーは、資格情報を入力した後にボタンではなくエンター キーを押したときに、自分もログインしていることを期待しています。そこで、ユーザー名とパスワードの入力フィールドに onkeypress-event を追加し、ログイン機能を実行する前に、Enter キー (if (thisEvent.keyCode==13) dosomething...) をチェックしました。
しかし、今ではキーが押されるたびにイベント ハンドラーが呼び出されます。もちろん、context.redirectToPage を常に実行する必要はありません。したがって、サーバー側のイベント ハンドラーを削除し、ログイン機能を変更して、ページ全体を含む div の部分的な更新で終了するようにしました。
var p = {"execLogin":"true"}; XSP.partialRefreshPost( '#{id:wholePage}', {params: p} );
部分的な更新を介して送信されたパラメーターは、context.redirectToPage が実行されるイベントをトリガーするようになりました。
<xp:this.beforeRenderResponse><![CDATA[#{javascript:if (param.containsKey('execLogin') && param.get('execLogin').toString().equals('true')) {
print("test");
context.redirectToPage(context.getUrl().toSiteRelativeString(context),true);
}}]]></xp:this.beforeRenderResponse>
ページが更新され、「test」が出力されますが、古い言語文字列がまだ表示されます。新しいユーザー言語を有効にするには、ページを手動で再度更新する必要があります。
この方法で本物のフルリフレッシュを実行する方法、またはプロパティバンドルから取得した文字列を更新する別の方法はありますか?
前もって感謝します。よろしく、サラ
編集
私は今持っています:
<xp:inputText id="cc_login_panel_login_username" styleClass="span2">
<xp:eventHandler event="onkeypress" submit="true" refreshMode="complete">
<xp:this.script><![CDATA[if (thisEvent.keyCode!=13) {
return false;
} else {
doLogin();
return true;
}]]></xp:this.script>
<xp:this.action><![CDATA[#{javascript:context.redirectToPage(context.getUrl().toSiteRelativeString(context));}]]></xp:this.action>
</xp:eventHandler>
context.reloadPage() はどういうわけか (奇妙なことに) ログインさえしなかったので、redirectToPage を使用することに戻りました。サーバー側のイベントは適切なタイミングで 1 回発生しますが、言語プロパティの動作は同じです。