わかりました。これをできるだけ短く、わかりやすくするようにします。
JQueryフルカレンダーを使用して、ユーザーにイベントを表示しています。ページにフィルターアクションがあり、ユーザーはさまざまな基準に基づいて表示されるイベントをフィルターできます。それらの基準の1つは、イベント名です。最終的な目標は、フィルターを取得して、フルカレンダービューから選択可能な「イベント名」オプションを再ロードすることです。
私はこれをすべて機能させていますが、同期していません。
フィルタを含めるJSPは次のようになります。
<div id="popUpFilterInfo" class="filterPopUp">
<s:action name="ScheduleFilter" executeResult="true" id="scheduleFilter"></s:action>
</div>
これにより、フィルタフォームを含む別のJSPページが返されます。Strutsはページのレンダリング時に実行されるため、このフィルターはビューが作成される前に作成されます。このフィルターは、ユーザーがボタンを選択すると、jQueryで非表示/表示されます。
このフィルターアクションは複数のページに含める必要があるため、ページアクションはフィルターアクションとは異なります。
フルカレンダーが読み込まれると、日付がページアクションに返され、アプリケーションのグローバルコンテキストのフィルターオブジェクトにそれらの日付が格納されます。
私が遭遇している問題は、ビューが変更されたときにページにフィルターだけをリロードさせることができないことです。ページ全体をリロードすると、フィルターには前のビューのデータが含まれているので、ScheduleFilterフォームを再レンダリングするようにページに指示するだけでよいことがわかります。私はjQueryでこれをやろうとしました:
var filter = "<s:action name=\"ScheduleFilter\" executeResult=\"true\" id=\"scheduleFilter\"></s:action>";
jQuery('#popUpFilterInfo').children().remove();
jQuery('#popUpFilterInfo').append(filter);
これにより、フィルター変数がインスタンス化されている行に「引用符が必要です」というJasperExceptionがスローされます。「名前」の真ん中に文字「m」を指定するのが問題です。
ページ全体をリロードせずに、このような埋め込みアクションをリロードする方法を知っている人はいますか?
答え:
<s:action>
デイブが以下に述べたように、タグにアクションを埋め込まないでください。これを切り替えて、代わりにAjaxでアクションを呼び出し、成功したら、jQueryを使用して返されたデータをフィルターフォームdivに挿入します。divが空かどうかを確認するためのチェックを入れ、すでにフィルターが含まれている場合はdivをクリアします。例を以下に示します
私のフィルターdiv:
<div id="popUpFilterInfo" class="filterPopUp"></div>
アクションコール:
function loadFilter() {
if(!jQuery('#popUpFilterInfo').is(':empty')){
jQuery('#popUpFilterInfo').children().remove();
}
jQuery.ajax({
url:'Filter.action',
data:"",
dataType: "",
type: "GET",
success: function(filter) {
jQuery('#popUpFilterInfo').append(filter);
}
});
}