我有超级视图谁负责渲染子视图.当我重新渲染的超视图中的所有事件的子视图都将丢失.
这是一个例子:
var SubView = Backbone.View.extend({
events: {
"click": "click"
},
click: function(){
console.log( "click!" );
},
render: function(){
this.$el.html( "click me" );
return this;
}
});
var Composer = Backbone.View.extend({
initialize: function(){
this.subView = new SubView();
},
render: function(){
this.$el.html( this.subView.render().el );
}
});
var composer = new Composer({el: $('#composer')});
composer.render();
Run Code Online (Sandbox Code Playgroud)
当我点击click me div时,会触发事件.如果我composer.render()再次执行,所有内容看起来都很相似,但不会再触发click事件.
检查工作jsFiddle.
[编辑:我通过调用delegateEvents()解决了早期的问题,但不应该这样做.重新发布更多信息.]
我有一个View,当渲染时它上面有一个登录按钮并附加了一个点击事件.首先渲染所有工作:单击按钮,成功调用ajax后,登录提示消失,并显示欢迎视图(LoggedInView).但是,如果我稍后导航回此视图(#foo),UI呈现但事件关联消失,而无需通过调用delegateEents()手动强制解决问题.
发生了什么事,我的事件没有重新关联自己?
LoginView = Backbone.View.extend({
template: _.template($("#loginTemplate").html()),
initialize: function(stuff,router) {
_.bindAll(this,'render','rc','gotProfile');
this.model.bind("rc",this.rc)
this.router = router;
},
events: {
'click .loginButton': 'login'
},
render: function() {
$(this.el).html(this.template(this.model.toJSON()));
$(this.el).find(".actionButton").button(); // Button
// this.delegateEvents(this.events); // NEEDED! Re-wire events on re-render
return this;
},
rc: function(code) {
switch(code) {
case errCodes.USER_NOT_FOUND: this.notFound(); break;
case errCodes.OK: this.loginOk(); break;
default: this.otherErr(); break;
}
},
login: function() {
clearErrors( $('[rel="req"]') );
var okReq = validate( $('#login [rel="req"]'), validateReq );
var okEmail = validate( [$('#uid')], validateEmail ); …Run Code Online (Sandbox Code Playgroud)