0

イベントハンドラーではなくビューのルートイベントで実行すると、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 回発生しますが、言語プロパティの動作は同じです。

4

4 に答える 4

1

$はページの読み込み時にのみ設定されますが、#は部分的な更新中に毎回設定されます。

ただし、部分的な更新はまったく機能しないと思います。これにより、計算フィールドが更新されます。ただし、プロパティファイルを含むXPageの部分を更新するには、完全に更新する必要があります。つまり、計算フィールドを更新しますが、同じプロパティファイルを使用します。

context.redirectToPageまたはcontext.reloadPageは、キャッシュされたプロパティファイルを使用して同じページに移動するのではないかと思います。

常に同じページに戻りたい場合は、部分的な更新ではなく完全な更新が最適なオプションです。

于 2013-01-17T20:17:38.960 に答える
0

xp:eventHandler の xp:this.action タグ内で "context.redirectToPage(context.getURL().toSiteRelativeString(context)))" を呼び出しているようです。

xp:this.action の代わりに xp:this.onComplete を使用してみてください。

アクションの Designer ツールチップによると、予想される戻り値は、ナビゲーション ハンドラーに渡される文字列です。したがって、代わりに onComplete を指定すると、イベントの eventHandler グループが処理されたときにリダイレクト コマンドが実行されます。

イベント ハンドラー アクションのツールチップ

于 2013-01-18T14:14:49.890 に答える
0

これは $ パラメータの使用と関係があると思います。これにより、現在のページがバックエンドで初めて作成されたときに言語ファイルを取得するようランタイムに指示されます。ユーザーが更新を行うと、実際には、表示しているページの保存されたバージョンが取得されます。

于 2013-01-17T13:37:42.407 に答える
0

すべての役立つ回答に感謝します。実際、それらはすべて機能しました。問題は、プロパティファイルがいつロードされるかについての私の誤解であることが判明しました。新しい言語が sessionScope に設定されるずっと前に、初期段階で読み込まれます (その sessionScope 変数は、VariableResolver を介して読み込まれるプロパティ ファイルの名前の一部として使用されます)。

ここで、2 回の完全更新を使用して新しいファイルを読み込みます。ログイン関数が正常に終了すると、以下が実行されます。

window.location.href = window.location.href + "?doRefresh=true";

ビューのルート要素に、次のイベントを追加しました。

<xp:this.beforeRenderResponse><![CDATA[#{javascript:
if (context.getUrlParameter("doRefresh")!=null&&context.getUrlParameter("doRefresh").equals("true")) {
    var url = context.getUrl().toSiteRelativeString(context);
    url = url.replace("?doRefresh=true","");
    context.redirectToPage(url);}
}]]></xp:this.beforeRenderResponse>

これはあまり洗練されたソリューションではありませんが、少なくとも機能します :-)

于 2013-01-19T12:09:01.813 に答える