javascript - 主干绑定(bind)事件多次触发

标签 javascript backbone.js

我正在尝试使用 backbone js 构建一个切换 View ,当我切换 View 几次时,发现我的绑定(bind)事件被触发了多次。

下面是更好说明的代码:

html

<div id='container'>
    halo world
</div>

<button id='but1'>red view</button>
<button id='but2'>blue view</button>

CSS

#red_view{
    width:400px;
    height:400px;
    background-color:red;        
}
#blue_view{
    width:400px;
    height:400px;
    background-color:blue;        
}
.button,.button2{
    width:300px;
    height:300px;
    background-color:gray;
}

javascript

RedView = Backbone.View.extend({
    el: "#container",
    events:{"click .button":"clickme"},
    clickme:function(){
        alert('redview');                        
    },
    initialize: function(){
        this.$el.html("<div id='red_view'><div class='button'>Click Me</div></div>");            
    }
});

BlueView = Backbone.View.extend({
    el: "#container",
    events:{"click .button2":"clickme2"},
    clickme2:function(){
        alert('blueview');                        
    },    
    initialize: function(){
        this.$el.html("<div id='blue_view'><div class='button2'>Click Me</div></div>");            
    }
});

$(document).ready(function(){
    //var router = new SystemRouter();

    $('#but1').click(function(){
       var view = new RedView();
    });
    $('#but2').click(function(){
       var view = new BlueView();
    });    
});

如果您点击红色 View 3 次,然后按“点击我”。它也会弹出警报 3 次。我怀疑需要在某处取消绑定(bind)事件,但找不到正确的方法来做到这一点。最好提供一些正确执行此操作的引用。

这是 jsfiddle 演示的链接。 http://jsfiddle.net/mochatony/DwRRk/31/

最佳答案

每次单击红色 View 蓝色 View 按钮时,您每次都会创建一个新的红色或蓝色 View 。您绑定(bind)它们的事件散列以响应源自具有类 buttonbutton2 的按钮的单击 DOM 事件。

  1. 按“红色 View ”3 次 -> 已创建 3 个 RedView 实例
  2. 单击类为“button”的按钮 -> DOM 事件
  3. 3 个 RedView 实例监听所述 DOM 事件 -> 3 个警报

这是因为您在创建新 View 之前没有清理 View ,这会有效地留下对事件做出响应的幽灵 View ,即使它们是看不见的。 (More info on the events hash)您可以使用类似这样的方法从您的 View 中清除事件。

cleanup: function() {
  this.undelegateEvents();
  $(this.el).clear();
}

这是您清理 View 的小工具 http://jsfiddle.net/DwRRk/34/

还有一个良好实践的提示:您应该使用诸如渲染方法之类的东西将内容附加到您的 DOM,使用初始化来初始化 View 所需的值。

关于javascript - 主干绑定(bind)事件多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11202707/

相关文章:

javascript - 我正在为我的 Discord 机器人创建一个用户信息命令,想知道是否有办法让 .createdAt 看起来更好

backbone.js - 集合中的下划线indexOf

backbone.js - 多条匹配路线

javascript - Javascript 中所有列 TD 的表行过滤

javascript - 在 Backbone.js 中按子字符串过滤集合

backbone.js - 用于 Backbone 应用程序的 Google Analytics 事件跟踪的在线资源

javascript - 将值设置为 Backbone.Model 中的折叠默认值

javascript - 在 HTML5 中创建拖放编辑平台

javascript - 通过 JS 或 HTML 调用 Python 脚本

javascript - 获取远程图像到字符串