我正在使用backbone.js 创建一个Web 应用程序。我有两个标签。Tab 1 是一个backbone.js 视图,而tab2 是另一个主干视图(同类)。
两个视图都加载到页面中的同一个 div 元素。目前我所做的是,当用户更改选项卡时,我使用主干路由器检测到它。然后路由器会检查视图是否已经存在,或者是否应该创建它。
我创建了一个对象管理器对象,它基于一个键存储视图对象(键是选项卡名称)
App.ObjectManager.getContentView = function (tabId) {
return App.ObjectManager.ContentHash[tabId];
};
App.ObjectManager.setContentView = function(tabId, view) {
App.ObjectManager.ContentHash[tabId] = view;
};
App.ObjectManager.hasContentView = function(tabId) {
if(App.ObjectManager.ContentHash[tabId]==undefined) {
return 0;
}
else{
return 1;
}
};
这是我创建视图并将其存储到列表对象的方法。每次单击选项卡时都会调用此代码,并且路由器会检测到更改。
$("#myDiv").html("");
if(App.ObjectManager.hasContentView(tabId)==0) { //View is not in the lookup table
console.log("View is not created yet. So we need to create");
content = new App.MyBackboneView(); //create a new view
App.ObjectManager.setContentView(tabId, content); //Store the view
}
else {
console.log("View is already created..So we read it and show it");
content = App.ObjectManager.getContentView(tabId);
}
//Now, we add the view to the main div
$("#myDiv").append(content.el);
上面的代码通过向 myDiv 显示视图来工作。我可以看到显示的文本框和单选按钮等的值。
唯一的事情 - 事件处理不起作用。因此,如果我在视图中有一个添加了事件处理程序的按钮,则在从保存的对象呈现视图时不会调用该事件。第一次显示视图时,正在处理单击事件。
例如,我在“说出我的名字!”视图中有这个按钮。
events: {
"click #say": "sayName"
},
sayName: function() {
console.log("I click say Name");
}
第一次加载视图时,当我按下按钮时,控制台会显示日志。当我再次返回选项卡时,从列表对象中显示这次视图时,单击事件不起作用。
我的代码有问题吗?
希望你能给我一些如何存储视图的方法,我可以再次重用视图。
谢谢。