我有这段代码:
PageView.js
var PageView = Backbone.View.extend({
events: {
'click .unpublish': 'unpublish'
},
tagName: 'tr',
className: 'pageedit',
template: Handlebars.compile( PageViewTemplate ),
render: function() {
this.$el.html( this.template( this.model ) );
return this;
},
unpublish: function() {
alert('hi');
}
});
PagesView.js
PagesView = Backbone.View.extend({
tagName: 'tbody',
initialize: function() {
this.collection.on('reset', this.render, this);
this.render();
},
template: Handlebars.compile(PagesTemplate),
render: function() {
var countPages = this.collection.at(0).get('count');
_.each(this.collection.at(0).get('pages'), function(model) {
pageView = new PageView({ model: model });
this.$el.append( pageView.render().el );
}, this);
$('.main').html( this.template({ pages: this.$el.html() }) );
this.delegateEvents(this.events);
return this;
},
});
Page.hbs
<td class="pageId">
{{ id }}
</td>
<td class="pagename">
<a href="/pages/{{ alias }}">{{ pagename }}</a>
</td>
<td class="catname">{{ catname }}</td>
<td class="author">{{ author }}</td>
<td>{{ date }}</td>
<td>
{{#if status}}
<a href="#" class="unpublish">
<img src='../{{ siteURL }}assets/img/admin/published.png'>
</a>
{{else}}
<a href="#" class="publish">
<img src='../{{ siteURL }}assets/img/admin/not-published.png'>
</a>
{{/if}}
</td>
<td>
<a href="#" class="intrash">
<img src='../{{ siteURL }}assets/img/admin/delete.png'>
</a>
</td>
Pages.hbs
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Catalog</th>
<th>Author</th>
<th>Date</th>
<th>Status</th>
<th>Intrash</th>
</tr>
</thead>
<tbody>
{{{pages}}}
</tbody>
</table>
在router.js中创建所有实例:
var pages = new Pages();
pages.fetch().done(function() {
new PagesView({ collection: pages});
});
如果单击.unpublish链接,则不会触发PageView中的事件。 所有视图呈现良好,但事件不起作用:( 可以帮我?
答案 0 :(得分:1)
我认为你的问题就在这里:
$('.main').html( this.template({ pages: this.$el.html() }) );
只要您说this.$el.html()
,就会丢失您的活动。 Backbone将delegate
(或其等价的on
)绑定到视图的el
以进行事件处理,因此事件处理绑定到DOM节点对象。当您说this.$el.html()
时,您已将所有内容转换为字符串,并且该字符串会进入DOM;但事件绑定到DOM元素对象而不是字符串。结果是一切看起来都正确但没有事件发生。
您的Pages.hbs
看起来应该更像这样:
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Catalog</th>
<th>Author</th>
<th>Date</th>
<th>Status</th>
<th>Intrash</th>
</tr>
</thead>
</table>
然后你应该做这样的事情来获取页面上的所有内容:
// Add the basic <table> HTML.
$('.main').html(this.template());
// Append the <tbody> DOM node which has event handling attached to it.
$('.main').find('table.table').append(this.$el);