Backbone 事件点击 table 行
Backbone event click on table row
我为 table 行创建了一个视图,我想听听对该行中任何单元格的任何点击。
我是这样实现的:
let ListItem = Backbone.View.extend({
events: {
'click tr': 'showDetails',
'click': 'showDetails'
},
template: function() {
return "<tr><td><img src=<%= imageUrl %> /></td><td class='name'><%= firstName %></td><td><%= lastName %></td><td><%= homeTown %></td><td><button type='button' id='ddd' class='btn btn-danger'>Delete</button></td></tr>";
},
render: function() {
var oTemplate = _.template(this.template());
this.$el.html(oTemplate(this.model.toJSON()));
$('table > tbody:last-child').append(this.$el.html());
return this;
},
showDetails: function() {
alert("*****");
},
hide: function(bToHide, index) {
index++;
if (!bToHide) {
$($('tr')[index]).show();
return;
}
$($('tr')[index]).hide();
this.rendered = true;
},
openActorView: function() {
window.open('/#actor/' + window.actorsCollection.indexOf(this.model), '_self');
}
});
点击里面的row\cells后,没有任何反应。
我听点击这个视图+点击tr,但是没有任何反应
此外,当向 tr td
添加事件时,以太币什么也没有发生。
感谢您的帮助
它不起作用的原因
$('table > tbody:last-child').append(this.$el.html());
jQuery .html()
function returns a string。
所以你正在创建一个漂亮的 Backbone 视图,具有易于定义的事件侦听器,然后你不使用它,你只需要它的字符串表示并将它转储到 DOM , 丢失之前绑定的任何事件侦听器。
改进
首先,不用把模板做成函数,直接用_.template
就可以了。我写了另一个答案,其中提供了有关 .
的更多信息
在那之后,不要在视图中使用全局选择器。它扼杀了作用域组件视图的目的。让父视图 class 处理这个问题。
let ListItem = Backbone.View.extend({
tagName: 'tr', // the list item is a `<tr>`
events: {
'click': 'showDetails'
},
template: _.template("<td><img src=<%= imageUrl %> /></td><td class='name'><%= firstName %></td><td><%= lastName %></td><td><%= homeTown %></td><td><button type='button' id='ddd' class='btn btn-danger'>Delete</button></td>"),
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
},
showDetails: function() {
console.log("show details event");
}
});
创建管理 table 的列表视图。这是将列表项放入 DOM.
的父级 class
不使用 jQuery 核心函数,而是使用 来缓存 table 主体。
let ListView = Backbone.View.extend({
initialize: function() {
this.$body = this.$('tbody');
},
render: function() {
this.$body.empty();
this.collection.each(this.renderItem, this);
return this;
},
renderItem: function(model) {
var view = new ListItem({ model: model });
this.$body.append(view.render().el); // use the DOMElement
}
});
然后从视图外部传递一个现有的 table。
new ListView({ el: 'table.my-table' }).render();
这是一个超级基本的示例,您应该知道性能可以进一步提高,如果按原样使用它可能会泄漏内存。
查看如何。
我为 table 行创建了一个视图,我想听听对该行中任何单元格的任何点击。 我是这样实现的:
let ListItem = Backbone.View.extend({
events: {
'click tr': 'showDetails',
'click': 'showDetails'
},
template: function() {
return "<tr><td><img src=<%= imageUrl %> /></td><td class='name'><%= firstName %></td><td><%= lastName %></td><td><%= homeTown %></td><td><button type='button' id='ddd' class='btn btn-danger'>Delete</button></td></tr>";
},
render: function() {
var oTemplate = _.template(this.template());
this.$el.html(oTemplate(this.model.toJSON()));
$('table > tbody:last-child').append(this.$el.html());
return this;
},
showDetails: function() {
alert("*****");
},
hide: function(bToHide, index) {
index++;
if (!bToHide) {
$($('tr')[index]).show();
return;
}
$($('tr')[index]).hide();
this.rendered = true;
},
openActorView: function() {
window.open('/#actor/' + window.actorsCollection.indexOf(this.model), '_self');
}
});
点击里面的row\cells后,没有任何反应。 我听点击这个视图+点击tr,但是没有任何反应
此外,当向 tr td
添加事件时,以太币什么也没有发生。
感谢您的帮助
它不起作用的原因
$('table > tbody:last-child').append(this.$el.html());
jQuery .html()
function returns a string。
所以你正在创建一个漂亮的 Backbone 视图,具有易于定义的事件侦听器,然后你不使用它,你只需要它的字符串表示并将它转储到 DOM , 丢失之前绑定的任何事件侦听器。
改进
首先,不用把模板做成函数,直接用_.template
就可以了。我写了另一个答案,其中提供了有关
在那之后,不要在视图中使用全局选择器。它扼杀了作用域组件视图的目的。让父视图 class 处理这个问题。
let ListItem = Backbone.View.extend({
tagName: 'tr', // the list item is a `<tr>`
events: {
'click': 'showDetails'
},
template: _.template("<td><img src=<%= imageUrl %> /></td><td class='name'><%= firstName %></td><td><%= lastName %></td><td><%= homeTown %></td><td><button type='button' id='ddd' class='btn btn-danger'>Delete</button></td>"),
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
},
showDetails: function() {
console.log("show details event");
}
});
创建管理 table 的列表视图。这是将列表项放入 DOM.
的父级 class不使用 jQuery 核心函数,而是使用
let ListView = Backbone.View.extend({
initialize: function() {
this.$body = this.$('tbody');
},
render: function() {
this.$body.empty();
this.collection.each(this.renderItem, this);
return this;
},
renderItem: function(model) {
var view = new ListItem({ model: model });
this.$body.append(view.render().el); // use the DOMElement
}
});
然后从视图外部传递一个现有的 table。
new ListView({ el: 'table.my-table' }).render();
这是一个超级基本的示例,您应该知道性能可以进一步提高,如果按原样使用它可能会泄漏内存。
查看如何