継承したサイトのバグを調査しています。調査の結果、興味深い JavaScript スコープの問題が発生しました。以下のコードは、関連する詳細のみを表示するために簡略化されています。
以下の一般的なサービスには、ログアウト後にデータが返されない場合があるという問題があります (もちろん、本番環境のみ)。その場合、ApplyToolbarBindings の "data" 引数が null または空のオブジェクトではないことがわかります。実際には、前のページ リクエストの状態でハイドレートされています。そのオブジェクトの状態は、asp.net ポストバックを通じて存続します。つまり、ログアウトした後でもツールバーに「既知の」ユーザーが表示されるという最終的な効果です。
function ApplyToolbarBindings(data) {
if (!data.IsKnown) {
jQuery("#ToolBar").attr("data-bind", 'template: { name: "AnonymousUserToolbarTemplate" }');
} else {
jQuery("#ToolBar").attr("data-bind", 'template: { name: "KnownUserToolbarTemplate" }');
}
ko.applyBindings(data, document.getElementById('ToolBar'));
}
function GetToolBarData(callbackFunction) {
jQuery.ajax({
url: '/Services/Toolbar/ToolBarService.ashx?v=' + toolbarV,
success: callbackFunction,
dataType: 'json',
type: 'GET'
});
}
function loadToolbar() {
GetToolBarUserData(ApplyToolbarBindings);
}
jQuery(function () { loadToolbar(); });
関数がグローバルに定義されている場合、関数への引数のライフサイクルはどのようなものですか? データが返されないときに ajax オブジェクトの状態が変更されないため、この動作ですか?