我正在尝试使用骨干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/
答案 0 :(得分:13)
每次点击red view
或blue view
按钮,您每次都会创建新的红色或蓝色视图。绑定它们的事件哈希以响应来自具有类button
和button2
的按钮的点击DOM事件。
这是因为您在创建新视图之前不会清理视图,而是会为您提供响应事件的ghost视图,即使它们无法看到。 (More info on the events hash)您可以使用类似的内容清除视图中的事件。
cleanup: function() {
this.undelegateEvents();
$(this.el).clear();
}
这是你清理视图http://jsfiddle.net/DwRRk/34/
的小提琴这也是一个良好实践的提示:您应该使用类似渲染方法的东西将东西附加到DOM,使用初始化来初始化视图所需的值。
答案 1 :(得分:2)
每次单击按钮时都会创建一个新视图,而不会破坏前一个视图。尝试使用单一视图,如下所示:
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;在你看来,否则这不会奏效。