[英]Loader is not working properly in knockoutjs
I have a menu bar in html page. 我在html页面中有一个菜单栏。 When i click on any menu option loader is showing until web user control loads. 当我单击任何菜单选项时,将显示加载程序,直到Web用户控件加载为止。 But problem is loader stops when user control load with initial html but that user control has some dynamic data which takes time to load so no loader is coming. 但是问题是,当用初始html加载用户控件时,加载器停止了,但是该用户控件具有一些动态数据,这需要花费一些时间来加载,因此没有加载器来。 I wanted the loader to continue showing until user control loads completely. 我希望加载程序继续显示,直到用户控件完全加载为止。 Following is my knockout js code 以下是我的淘汰赛js代码
function ClientAdminTabViewModel() {
var that = this,
view = {};
this.loading = ko.observable(false);
this.tabs = [
{
dataUrl: null,
isSelected: ko.observable(false),
name: "residents",
onOpen: function (e, tabData) {
new ResPortal.Admin.ClientAdmin();
},
title: "Residents",
url: "Default.aspx/ClientAdminTab"
},
{
dataUrl: null, // TODO
isSelected: ko.observable(false),
name: "reports",
onOpen: function (e, tabData) {
that.openTab(that.tabs[1].subMenus[0]);
},
subMenus: [
{
dataUrl: null,
name: "userDetail",
onOpen: function () {
new ResPortal.Admin.ClientAdminUserDetailReport();
},
title: "User Detail",
url: "/Admin/Default.aspx/ClientAdminUserDetailReportTab", // Tab
visible: ko.observable(true)
},
{
dataUrl: null, // TODO
name: "residentStatus",
onOpen: function () {
new ResPortal.Admin.ClientAdminResidentStatusReport();
},
title: "Resident Status",
url: "/Admin/Default.aspx/ClientAdminResidentStatusReportTab", // Tab
visible: ko.observable(true)
}
],
title: "Reports",
url: "Default.aspx/ClientAdminUserDetailReportTab" // TODO
}
];
this.currentTab = ko.computed(function () {
var result = _(that.tabs).find(function (tab) {
return tab.isSelected();
});
return result;
});
this.formatTabs = function (elements, data) {
var $ul = $(elements).filter("li").parent();
if ($ul.children("li").length < that.tabs.length) {
return;
}
$ul.htmlClean();
};
this.openTab = function (tab, data) {
var $mainPanel = $("#MainPanel"),
isSubMenu,
render;
if (!tab) {
window.location.hash = "";
return;
}
isSubMenu = (tab.isSelected === undefined);
render = function (html) {
$mainPanel.html(html);
if (tab.onOpen) {
tab.onOpen($.event, data);
}
};
if (!isSubMenu && tab.isSelected()) {
return;
}
if (!isSubMenu) {
that.selectTab(tab);
}
if (tab.url === "") {
return;
}
$mainPanel.html("");
if (view[tab.name]) {
render(view[tab.name]);
} else {
that.loading(true);
$.ajax({
type: "POST",
url: tab.url,
data: JSON.stringify({
}),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).fail(function (data) {
ResPortal.Helpers.notify(data.d.Message || "Server error", "error");
}).done(function (data) {
// Cache the tab's HTML
view[tab.name] = data.d;
render(data.d);
that.loading(false);
});
}
location.hash = tab.name;
};
this.selectTab = function (tab) {
var tb = _(that.tabs).find(function (t) {
return t === tab;
});
if (tb) {
tb.isSelected(true);
_(that.tabs).each(function (t) {
if (t !== tab) {
t.isSelected(false);
}
});
} else {
window.location = window.location;
}
};
};
function MaAdminTabViewModel() {
var that = this,
view = {};
this.loading = ko.observable(false);
this.tabs = [
{
dataUrl: null,
isSelected: ko.observable(false),
name: "clientadmins",
onOpen: function (e, tabData) {
new ResPortal.Admin.MaAdmin();
},
title: "Client Admins",
url: "MaAdminTab.html"
},
{
dataUrl: null,
isSelected: ko.observable(false),
name: "tools",
onOpen: function (e, tabData) {
new ResPortal.Admin.Tools();
},
subMenus: [
{
dataUrl: null,
name: "TestEmail",
onOpen: function () {
new ResPortal.Admin.Tools();
},
title: "Test Email",
url: "ToolsTab.html",
visible: ko.observable(true)
}
],
title: "Tools",
url: "ToolsTab.html"
}
];
this.currentTab = ko.computed(function () {
var result = _(that.tabs).find(function (tab) {
return tab.isSelected();
});
return result;
});
this.formatTabs = function (elements, data) {
var $ul = $(elements).filter("li").parent();
if ($ul.children("li").length < that.tabs.length) {
return;
}
$ul.htmlClean();
};
this.openTab = function (tab, data) {
var $mainPanel = $("#MainPanel"),
isSubMenu,
render;
if (!tab) {
window.location.hash = "";
return;
}
isSubMenu = (tab.isSelected === undefined);
render = function (html) {
$mainPanel.html(html);
if (tab.onOpen) {
tab.onOpen($.event, data);
}
};
if (!isSubMenu && tab.isSelected()) {
return;
}
if (!isSubMenu) {
that.selectTab(tab);
}
if (tab.url === "") {
return;
}
$mainPanel.html("");
if (view[tab.name]) {
render(view[tab.name]);
} else {
that.loading(true);
if (tab.url.indexOf(".html") === -1) {
$.ajax({
type: "POST",
url: tab.url,
data: JSON.stringify({
}),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).fail(function (data) {
ResPortal.Helpers.notify(data.d.Message || "Server error", "error");
}).done(function (data) {
// Cache the tab's HTML
view[tab.name] = data.d;
render(data.d);
that.loading(false);
});
} else {
$.get(tab.url, function (html) {
view[tab.name] = html;
render(html);
}).fail(function (d) {
ResPortal.Helpers.notify("Server error", "error");
}).always(function () {
that.loading(false);
});
}
}
location.hash = tab.name;
};
this.selectTab = function (tab) {
var tb = _(that.tabs).find(function (t) {
return t === tab;
});
if (tb) {
tb.isSelected(true);
_(that.tabs).each(function (t) {
if (t !== tab) {
t.isSelected(false);
}
});
} else {
window.location = window.location;
}
};
};
function ResidentTabViewModel() {
var that = this,
view = {};
this.loading = ko.observable(false);
this.tabs = tabs = [
{
dataUrl: null,
isSelected: ko.observable(true),
name: "landing",
onOpen: $.noop,
title: "Home",
url: "/Home/Default.aspx/LandingTab" // TODO
},
{
dataUrl: "/Home/Default.aspx/Account", // TODO
isDefault: true,
isSelected: ko.observable(false),
name: "account",
onOpen: function (e, tabData) {
$.ajax({
type: "POST",
url: "/Home/Default.aspx/Account", // TODO
data: JSON.stringify({}),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).fail(function (data) {
ResPortal.Helpers.notify(data.d.Message || "Server error", "error");
}).done(function (data) {
var myAccountVm = new ResPortal.Home.MyAcountViewModel(data.d);
if ($("#GetStatementForm").length) {
ko.applyBindings(myAccountVm, document.getElementById("GetStatementForm"));
ko.applyBindings(myAccountVm, document.getElementById("EditEbillingInfoForm"));
}
if (tabData && tabData.split && tabData.split("/")[0].toLowerCase() === "statement") { // tabData.split tests that this event wasn't triggered by a tab change to the My Account tab
myAccountVm
.currBillId(tabData.split("/").slice(1).join("/"))
.viewBill();
}
});
},
subMenus: [
{
dataUrl: "/Home/Default.aspx/Account", // TODO
name: "account",
onOpen: function () {
var acctTab = _.find(that.tabs, function (t) {
return t.name === "account";
});
acctTab.onOpen();
},
title: "My Account",
url: "/Home/Default.aspx/AccountTab", // Tab
visible: ko.observable(true)
},
{
dataUrl: "/Home/Default.aspx/ManageAccount",
name: "manage",
onOpen: function () {
$.ajax({
type: "POST",
url: "/Home/Default.aspx/ManageAccount",
data: JSON.stringify({}),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).fail(function (data) {
ResPortal.Helpers.notify(data.d.Message || "Server error", "error");
}).done(function (data) {
var bankAccountVm = new ResPortal.Home.BankAccountViewModel(data.d),
creditCardAccountVm = new ResPortal.Home.CreditCardAccountViewModel(data.d),
residentSummaryVm = new ResPortal.Home.ResidentSummaryViewModel(bankAccountVm, creditCardAccountVm, tabVm, data.d.Data.CurrentBalance, data.d.Data.CurrentLedgerBalance, data.d.Data.HasStopPayment);
ko.applyBindings(bankAccountVm, document.getElementById("EditBankAccountForm"));
ko.applyBindings(creditCardAccountVm, document.getElementById("EditCreditCardAccountForm"));
ko.applyBindings(residentSummaryVm, document.getElementById("middle"));
});
},
title: "Manage Account",
url: "/Home/Default.aspx/ManageAccountTab", // TODO
visible: ko.observable(isFundTechProp)
},
{
dataUrl: "/Home/Default.aspx/MakePayment", // TODO
name: "pay",
onOpen: function () {
$.ajax({
type: "POST",
url: "/Home/Default.aspx/MakePayment", // TODO
data: JSON.stringify({
}),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).fail(function (data) {
ResPortal.Helpers.notify(data.d.Message || "Server error", "error");
}).done(function (data) {
var autoPayVm = new ResPortal.Home.AutoPayViewModel(data.d),
makePaymentVm = new ResPortal.Home.MakePaymentViewModel(data.d),
payNearMeVm = new ResPortal.Home.PayNearMeViewModel(data.d);
ko.applyBindings(makePaymentVm, document.getElementById("OneTimePaymentPanel"));
ko.applyBindings(payNearMeVm, document.getElementById("PnmPaymentPanel"));
ko.applyBindings(autoPayVm, document.getElementById("AutoPayPanel"));
});
},
title: "Make a Payment",
url: "/Home/Default.aspx/MakePaymentTab", // TODO
visible: ko.observable(true)
},
{
dataUrl: "/Home/Default.aspx/PaymentHistory", // TODO
name: "payments",
onOpen: $.noop,
title: "Payment History",
url: "/Home/Default.aspx/PaymentHistoryTab", // TODO
visible: ko.observable(true)
}
],
title: "My Account",
url: "/Home/Default.aspx/AccountTab" // TODO
},
{
dataUrl: "/Home/Default.aspx/Personal", // TODO
isSelected: ko.observable(false),
name: "personal",
onOpen: function () {
$.ajax({
type: "POST",
url: "/Home/Default.aspx/Personal", // TODO
data: JSON.stringify({
}),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).fail(function (data) {
ResPortal.Helpers.notify(data.d.Message || "Server error", "error");
}).done(function (data) {
var loginVm = new ResPortal.Home.LoginViewModel(data.d),
emailVm = new ResPortal.Home.EmailViewModel(data.d),
passwordVm = new ResPortal.Home.PasswordViewModel(),
securityQuestionsVm = new ResPortal.Home.SecurityQuestionsViewModel(data.d);
ko.applyBindings(loginVm, document.getElementById("EditLoginForm"));
ko.applyBindings(loginVm, $("#top span.login").get()[0]);
ko.applyBindings(emailVm, document.getElementById("EditEmailForm"));
ko.applyBindings(emailVm, $("#top span.email").get()[0]);
ko.applyBindings(passwordVm, document.getElementById("EditPasswordForm"));
ko.applyBindings(securityQuestionsVm, document.getElementById("EditSecurityQuestionsContainer"));
});
},
title: "Personal Information",
url: "/Home/Default.aspx/PersonalTab" // TODO
}
];
this.currentTab = ko.computed(function () {
var result = _(that.tabs).find(function (tab) {
return tab.isSelected();
});
return result;
});
this.formatTabs = function (elements, data) {
var $ul = $(elements).filter("li").parent();
if ($ul.children("li").length < that.tabs.length) {
return;
}
$ul.htmlClean();
};
this.openTab = function (tab, data) {
var $mainPanel = $("#MainPanel"),
isSubMenu,
render;
if (!tab) {
window.location.hash = "";
return;
}
isSubMenu = (tab.isSelected === undefined);
render = function (html) {
$mainPanel.html(html);
if (tab.onOpen) {
tab.onOpen($.event, data);
}
};
if (!isSubMenu && tab.isSelected()) {
return;
}
if (!isSubMenu) {
that.selectTab(tab);
}
if (tab.url === "") {
return;
}
$mainPanel.html("");
if (view[tab.name]) {
render(view[tab.name]);
} else {
that.loading(true);
$.ajax({
type: "POST",
url: tab.url,
data: JSON.stringify({
}),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).fail(function (data) {
ResPortal.Helpers.notify(data.d.Message || "Server error", "error");
}).done(function (data) {
// Cache the tab's HTML
view[tab.name] = data.d;
render(data.d);
that.loading(false);
});
}
location.hash = tab.name;
};
this.selectTab = function (tab) {
var tb = _(that.tabs).find(function (t) {
return t === tab;
});
if (tb) {
tb.isSelected(true);
_(that.tabs).each(function (t) {
if (t !== tab) {
t.isSelected(false);
}
});
} else {
window.location = window.location;
}
};
};
switch (role) {
case "clientadmin":
tabVm = new ClientAdminTabViewModel();
break;
case "maadmin":
tabVm = new MaAdminTabViewModel();
break;
case "resident":
tabVm = new ResidentTabViewModel();
break;
}
$logoutLink
.text($logoutLink.text())
.children("span")
.remove()
.end()
.button();
ko.applyBindings(tabVm, document.getElementById("MenuPanel"));
ko.applyBindings(tabVm, document.getElementById("BusyText"));
switch (role) {
case "clientadmin":
case "maadmin":
var defaultTab = tabVm.tabs[0];
tabVm.openTab(defaultTab, "");
break;
case "resident":
$.ajax({
type: "POST",
url: "/Home/Default.aspx/ManageAccount",
data: JSON.stringify({
}),
contentType: "application/json; charset=utf-8",
dataType: "json"
}).fail(function (data) {
if (data.status === 401) {
window.location = "/"; // TODO
return;
}
ResPortal.Helpers.notify(data.d.Message || "Server error", "error");
}).done(function (data) {
var bankAccountVm,
creditCardAccountVm,
residentSummaryVm ,
defaultTab,
defaultSubMenu,
hashParts,
hashTab;
if (!data.d.Success) {
return;
}
bankAccountVm = new ResPortal.Home.BankAccountViewModel(data.d);
creditCardAccountVm = new ResPortal.Home.CreditCardAccountViewModel(data.d);
residentSummaryVm = new ResPortal.Home.ResidentSummaryViewModel(bankAccountVm, creditCardAccountVm, tabVm, data.d.Data.CurrentBalance, data.d.Data.CurrentLedgerBalance, data.d.Data.HasStopPayment);
ko.applyBindings(residentSummaryVm, document.getElementById("middle"));
// Open to the requested statement
// This routine could be expanded to something more robust when needed
if (window.location.hash.length) {
hashParts = window.location.hash.split("/");
hashTab = hashTab = hashParts[0].slice(1).toLowerCase();
_.each(tabVm.tabs, function (tab) {
if (tab.name === hashTab) {
defaultTab = tab;
}
if (!defaultTab && tab.subMenus) {
_.each(tab.subMenus, function (subMenu) {
if (subMenu.name === hashTab) {
defaultTab = tab;
defaultSubMenu = subMenu;
}
});
}
});
if (defaultSubMenu) {
tabVm.selectTab(defaultTab);
tabVm.openTab(defaultSubMenu, hashParts.slice(1).join("/"));
} else {
tabVm.openTab(defaultTab, hashParts.slice(1).join("/"));
}
}
});
break;
}
}; };
Firstly you have to remove the expression that.loading(false);
首先,您必须删除表达式that.loading(false);
from its current position. 从当前位置开始。
Secondly insert this expression into .always(...)
callback for every .ajax
subrequest performed by tab's onOpen
handler: 其次,对于由tab的onOpen
处理程序执行的每个 .ajax
子请求,将此表达式插入.always(...)
回调中:
onOpen: function () {
$.ajax({
// ...
}).fail(function (data) {
// ...
}).done(function (data) {
// ...
}).always(function(){
that.loading(false);
});
},
You can simply use the methods provided by the javascript jquery 您可以简单地使用javascript jquery提供的方法
beforeSend: function(data){
// you can put your loader here
},
success: function(data){
// events after you data gets load completely
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.