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 在视图之间移动时,主干会丢失下拉事件_Javascript_Backbone.js_Backbone Views - Fatal编程技术网

Javascript 在视图之间移动时,主干会丢失下拉事件

Javascript 在视图之间移动时,主干会丢失下拉事件,javascript,backbone.js,backbone-views,Javascript,Backbone.js,Backbone Views,我有一个视图定义了如下几个事件: events: { 'click .js-icon-remove': 'removeFilter', 'change .select-control': 'updateFilters', 'click #btn_search': 'requestSearch', 'click #btn_add_search': 'requestSaveSearch' } 三个单击事件位于按钮或链接上,而更改事件位于下拉列表上。首次渲染视图时,所

我有一个视图定义了如下几个事件:

events: {
    'click .js-icon-remove': 'removeFilter',
    'change .select-control': 'updateFilters',
    'click #btn_search': 'requestSearch',
    'click #btn_add_search': 'requestSaveSearch'
}
三个单击事件位于按钮或链接上,而更改事件位于下拉列表上。首次渲染视图时,所有事件都可以正常工作。但是,当我转到另一个页面,然后返回此视图时,下拉事件将丢失。如果我重新加载浏览器,一切又正常了。它们甚至可以多次正常工作,而不仅仅是第一次。当我重新呈现视图时,事件绑定丢失了


我已尝试将事件从更改更改为单击,或从类更改为元素选择而不是。选择控件。所有的事情在视图第一次呈现时都会起作用,就是这样。

这将介绍事件绑定在主干网和DOM中的工作方式

当视图呈现时,它的$el被添加到DOM中,主干会自动绑定事件。但是,一旦从dom中删除视图的$el,那么当$el添加回dom中时,这些事件将需要重新绑定。这就是delegateEvents方法所做的

在主干网中工作时的一个最佳实践是使视图成为一次性的,例如在从DOM中删除视图后不要将它们保留在周围。当您离开视图并将其从dom中删除,然后再向后导航时,您应该重新实例化视图,呈现它,然后再次将其添加到dom中。您可以保留模型和集合,这样就不会有重绘数据,但视图留在dom中或每次添加/删除时都重新创建时,效果会更好


我强烈推荐Marionette.js,特别是它的region类。在视图处理方面,它为您节省了大量样板代码。

经过进一步研究,我发现使用this.delegateEvents重新绑定事件。这是工作良好,但现在我仍然不适应这个解决方案。我不明白为什么我必须手动执行此操作。另外,我仍然有兴趣知道为什么只有一些事件丢失了。当我转到另一个页面和重新渲染时,你是什么意思?如果我触发了另一个渲染不同视图的路由,然后通过单击链接或使用“后退”按钮返回。在这两种情况下,你会得到相同的行为吗,点击链接或点击后退按钮?我要补充一点,当你点击一个链接的时候,你是在发射一个路由吗?使用主干路由时有点反模式这里没有足够的信息来了解您的事件发生了什么,抱歉。