我在我的应用程序中使用bootstrap,backbone,marionette,需要js支持。这是一个中等大小的应用程序,具有许多视图和子视图。由于它包含选项卡式显示,我使用的是引导标签。
在我的布局视图中,我正在处理显示的事件显示事件并尝试执行特定于选项卡窗格的渲染,如下所示...
var AppLayoutView = Backbone.Marionette.LayoutView.extend({
el : "body",
regions: {
headerRegion: "#ecp_header",
bodyRegion: "#ecp_body",
contentRegion: "#home"
},
events: {
'shown.bs.tab ul.nav-tabs a': 'onTabShown'
},
...
onTabShown: function(e) {
var self = this;
console.log("App layout view: 'onTabShown' executing...");
var tabId = $(e.currentTarget).attr('id');
if (tabId === 'home-tab') {
/** Show the dashboard (home) view */
require(['user_dashboard_layout'],
function(UserDashboardLayoutView) {
// update the URL in addressbar, so it can be available in history stack
Backbone.history.navigate('dashboard');
var dbLytView = new UserDashboardLayoutView();
dbLytView.render();
//self.bodyRegion.show(dbLytView);
//self.contentRegion.attachView(dbLytView);
});
} else if (tabId == "scheduling-tab") { ... }
所有这一切都运行得很好,直到我添加了历史导航线的行,如上面的代码所示。
Backbone.history.navigate('dashboard');
我还添加了app_controller来处理路由。但在此之后,我发现了一种奇怪的行为。我看到上面的fn" onTabShown"每当我在我的应用程序上执行登录/注销时,就会在浏览器控制台窗口(附带屏幕截图)中多次调用。
BTW,在我的SPA(单页面应用程序)中,当用户登录时,我会显示仪表板(如果用户已登录),或显示欢迎页面(如果未登录)。
如果存在违规行(history.navigate(...)),我可以看到tabShown被多次调用,也就是说,每次登录/注销都会被累积(某种奇怪的递归或堆栈)没有解开)。
但是,如果我注释掉history.navigate行,退出后它不会执行页面刷新。
我的基本问题是......
从文档中看来,我们需要调用bb.h.navigate(...)来保持地址栏中的url与我们当前的app状态保持同步。但是,我遇到了这种奇怪的行为?
由于应用程序有点相当复杂,我可能没有提供所有相关细节来征求对此qn的正确答案。
愿有人指出我正确的方向......?