Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何存储backbone.js视图,然后再次重用它_Javascript_Backbone.js - Fatal编程技术网

Javascript 如何存储backbone.js视图,然后再次重用它

Javascript 如何存储backbone.js视图,然后再次重用它,javascript,backbone.js,Javascript,Backbone.js,我正在使用backbone.js创建一个web应用程序。我有两个标签。Tab 1是一个backbone.js视图,Tab 2是另一个backbone视图(同类) 这两个视图都加载到页面中的同一个div元素中。目前我所做的是,当用户更改选项卡时,我使用主干路由器检测它。然后路由器进行检查,查看是否已经存在视图,或者是否应该创建视图 我创建了一个对象管理器对象,它基于键(键是选项卡名称)存储视图对象 下面是我创建和存储视图到列表对象的步骤。每次单击选项卡,路由器检测到更改时,都会调用此代码 $("#

我正在使用backbone.js创建一个web应用程序。我有两个标签。Tab 1是一个backbone.js视图,Tab 2是另一个backbone视图(同类)

这两个视图都加载到页面中的同一个div元素中。目前我所做的是,当用户更改选项卡时,我使用主干路由器检测它。然后路由器进行检查,查看是否已经存在视图,或者是否应该创建视图

我创建了一个对象管理器对象,它基于键(键是选项卡名称)存储视图对象

下面是我创建和存储视图到列表对象的步骤。每次单击选项卡,路由器检测到更改时,都会调用此代码

$("#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显示视图来工作。我可以看到显示的文本框和单选按钮等的值

唯一的问题是事件处理不起作用。因此,如果视图中有一个按钮添加了事件处理程序,则从保存的对象渲染视图时不会调用该事件。首次显示视图时,单击事件正在处理

例如,我在视图中有一个按钮“说出我的名字!”

第一次加载视图时,当我按下按钮时,console会显示日志。当我再次回到选项卡时,此时从列表对象显示视图,单击事件不起作用

我的代码有问题吗

希望您能给我一些方法来存储视图,我可以再次重用视图


谢谢。

创建视图时,请清空myDiv内容

$("#myDiv").html("");
我认为此操作会自动删除您先前在视图中设置的所有绑定。这实际上是主干网的一个常见问题——该框架将事件侦听器设置为视图中的dom元素

处理这个问题最简单的方法可能是为#myDiv作为一个整体创建一个父视图,并在其中设置事件

视图结构可能如下所示:

TabsView(在此处设置事件) | -选项卡视图1(渲染内容)
-选项卡视图2(呈现内容)

我也有同样的问题,我有几个“选项卡视图”显示聚合数据,如“我的消息”、“所有消息”、“所有用户”等。我将视图的对象存储在散列中,比如“视图”

是的,正如凯恩·科恩所提到的:

$('#myDiv').html('') or $('#myDiv').$el.empty()
销毁所有绑定。。。对我有效的方法是使用“分离”,因为它不会破坏绑定(),假设以前显示的内容是“所有消息”,用户单击“我的消息”:

views['All messages'].$el.detach()
$('#myDiv').append views['My messages'].el
我用coffescript。。。
另外,希望这能有所帮助,尽管我对这种方法不满意……

或$(“#myDiv”).empty()。同样的事情,但有点优雅。@TyroneMichael,我也通常使用empty()而不是html(“”),但由于这是问题中的一行,我认为没有必要修改它。谢谢。凉的下面是我做的App.TabMainView=Backbone.View.extend({el:#myDiv),事件:{click#say:“sayName”},sayName:function(){console.log(“I click say Name”);},initialize:function(){console.log(“Main TabsView View-created”);var-content=this.options.model.content;$(this.el).append(content.el);});然后在路由器代码中,我添加content=App.ObjectManager.getContentView(tabId);var模型={content:content};var tabView=newapp.TabMainView({model:model});通过上面的代码更改,现在我看到事件已启用。只是事情越来越复杂了。i、 例如,当我单击选项卡1并按下按钮时,它会显示“我单击说出姓名”,然后,当我转到选项卡2并按下按钮时,它会显示“我单击说出姓名”两次,当我再次来到选项卡1时,按下按钮时,它会显示“我单击说出姓名”三次。还有什么我应该在上面检查的来处理这个多句柄堆叠吗?@user1402539,检查你的代码,看起来你要重新初始化TabMainView两次。它应该只初始化一次。您是否从单个选项卡视图中删除了单击事件?您应该将其作为新问题发布,而不是作为旧问题的答案发布
$('#myDiv').html('') or $('#myDiv').$el.empty()
views['All messages'].$el.detach()
$('#myDiv').append views['My messages'].el