Backbone绑定事件多次触发

时间:2012-06-26 07:37:09

标签: javascript backbone.js

我正在尝试使用骨干js构建一个切换视图,并且当我切换视图几次时,发现我的多次绑定事件被触发。

以下是更好说明的代码:

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();
    });    
});

如果您单击红色视图3次,请按“单击我”。它会弹出警报3次。我怀疑有必要在某个地方取消绑定事件,但找不到合适的方法。最好提供一些正确执行此操作的参考。

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

3 个答案:

答案 0 :(得分:13)

每次点击red viewblue view按钮,您每次都会创建新的红色或蓝色视图。绑定它们的事件哈希以响应来自具有类buttonbutton2的按钮的点击DOM事件。

  1. 按'红色视图'3次 - &gt;创建了RedView的3个实例
  2. 点击“按钮”类的按钮 - &gt; DOM事件
  3. 3个RedView实例侦听所述DOM事件 - &gt; 3个提醒
  4. 这是因为您在创建新视图之前不会清理视图,而是会为您提供响应事件的ghost视图,即使它们无法看到。 (More info on the events hash)您可以使用类似的内容清除视图中的事件。

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

    这是你清理视图http://jsfiddle.net/DwRRk/34/

    的小提琴

    这也是一个良好实践的提示:您应该使用类似渲染方法的东西将东西附加到DOM,使用初始化来初始化视图所需的值。

答案 1 :(得分:2)

每次单击按钮时都会创建一个新视图,而不会破坏前一个视图。尝试使用单一视图,如下所示:

http://jsfiddle.net/DwRRk/32/

var SomeModel = Backbone.Model.extend({});

var SomeView = Backbone.View.extend({
    el: "#container",
    model: SomeModel,
    events: {
        "click .button": "clickme"
    },
    clickme: function() {
        alert(this.model.get("color"));
    },
    colorChanged: function() {
        this.$el.html("<div id='" + this.model.get("color") + "_view'><div class='button'>Click Me</div></div>");
    },

    initialize: function() {
        _.bindAll( this, "colorChanged" );
        this.model.on("change:color", this.colorChanged );
        this.model.on("reset", this.colorChanged );
    }
});



$(document).ready(function() {
    //var router = new SystemRouter();
    var model = new SomeModel({color: "red"}),
        view = new SomeView({model: model})


    $('#but1').click(function() {
        model.set("color", "red");
    });
    $('#but2').click(function() {
        model.set("color", "blue");
    });
});​

答案 2 :(得分:2)

这是删除幽灵视图的另一种方式(我正在使用的)

disposeView: function(view){
   Backbone.View.prototype.close = function () {
      this.unbind();
      this.undelegateEvents();
   };

   /* --Destroy current view */
   if(this.currentView !== undefined) {
      this.currentView.close();
   }

   /* --Create new view */
   this.currentView = view;
   this.currentView.delegateEvents();

   return this.currentView;
}

disposeView(new view());

务必一直返回&#34;这个&#34;在你看来,否则这不会奏效。