在 Backbone.View 的 delegateEvents 中寻找渲染事件
Looking for render event in delegateEvents in Backbone.View
我有一个关于 Backbone.View
及其 delegateEvents
的问题。您可以在文档 here 中阅读有关 extend
方法的信息。使用这个方法,可以"override the render function, specify your declarative events"等
我有一个关于 声明事件 或 delegateEvents 的问题(不确定我应该如何称呼它)。它们被描述为 here。这是一个例子:
var DocumentView = Backbone.View.extend({
events: {
"dblclick" : "open",
"click .icon.doc" : "select",
"contextmenu .icon.doc" : "showMenu",
"click .show_notes" : "toggleNotes",
"click .title .lock" : "editAccessLevel",
"mouseover .title .date" : "showTooltip"
},
open: function() {
window.open(this.model.get("viewer_url"));
},
select: function() {
this.model.set({selected: true});
},
...
});
如您所见,您可以在模板中的特定对象上添加不同的事件DOM。喜欢 click
或 mouseover
。所以,有了这个模板:
<foo></foo>
{#myplayers}
<player class="normal" value="{player}" style="{style}"></player>
{/myplayers}
您可以为每个玩家添加不同的 click
事件,如下所示:
events: {
'click player': 'playerClick'
},
playerClick: function( e ) {
var playerValue = e.currentTarget.getAttribute( 'value' );
// HERE: e.currentTarget I've particular player
}
我的问题:我可以用与单击事件类似的方式声明渲染事件吗?我想在渲染单个玩家(而不是整个列表)时捕获事件。我需要得到 e.currentTarget
并稍微改变它的 css 。
我正在寻找这样的东西:
events: {
'render player': 'playerRendered'
},
playerRendered: function( e ) {
var playerValue = e.currentTarget.getAttribute( 'value' );
// HERE: e.currentTarget I've particular player
}
我该怎么做?因为 delegateEvents 中的 render
不起作用:/
也许在您的视图中的初始化函数中,您可以对渲染进行 listenTo。类似的东西:
var view = Backbone.View.extend({
className: 'list-container',
template: _.template($('#my-template').html()),
initialize: function () {
this.listenTo(this, 'render', function () {
console.info('actions');
});
},
render: function() {
this.$el.html(this.template(this));
return this;
},
});
然后:
var myView = new view();
myView.render();
myView.trigger('render');
$('#container').html(myView.el);
var View = Backbone.View.extend({
events: {
'render .myselector': 'playerRendered'
},
playerRendered: function( e ) {
console.log("arguments");
var playerValue = e.currentTarget.getAttribute( 'value' );
// HERE: e.currentTarget I've particular player
},
render:function(){
console.log("render");
this.$el.html("<div class='myselector'></div>");
}
});
var view = new View();
view.render();
您可以使用 Jquery trigger
触发
this.$(".myselector").trigger("render");
或在您的视野之外
view.$(".myselector").trigger("render");
我有一个关于 Backbone.View
及其 delegateEvents
的问题。您可以在文档 here 中阅读有关 extend
方法的信息。使用这个方法,可以"override the render function, specify your declarative events"等
我有一个关于 声明事件 或 delegateEvents 的问题(不确定我应该如何称呼它)。它们被描述为 here。这是一个例子:
var DocumentView = Backbone.View.extend({
events: {
"dblclick" : "open",
"click .icon.doc" : "select",
"contextmenu .icon.doc" : "showMenu",
"click .show_notes" : "toggleNotes",
"click .title .lock" : "editAccessLevel",
"mouseover .title .date" : "showTooltip"
},
open: function() {
window.open(this.model.get("viewer_url"));
},
select: function() {
this.model.set({selected: true});
},
...
});
如您所见,您可以在模板中的特定对象上添加不同的事件DOM。喜欢 click
或 mouseover
。所以,有了这个模板:
<foo></foo>
{#myplayers}
<player class="normal" value="{player}" style="{style}"></player>
{/myplayers}
您可以为每个玩家添加不同的 click
事件,如下所示:
events: {
'click player': 'playerClick'
},
playerClick: function( e ) {
var playerValue = e.currentTarget.getAttribute( 'value' );
// HERE: e.currentTarget I've particular player
}
我的问题:我可以用与单击事件类似的方式声明渲染事件吗?我想在渲染单个玩家(而不是整个列表)时捕获事件。我需要得到 e.currentTarget
并稍微改变它的 css 。
我正在寻找这样的东西:
events: {
'render player': 'playerRendered'
},
playerRendered: function( e ) {
var playerValue = e.currentTarget.getAttribute( 'value' );
// HERE: e.currentTarget I've particular player
}
我该怎么做?因为 delegateEvents 中的 render
不起作用:/
也许在您的视图中的初始化函数中,您可以对渲染进行 listenTo。类似的东西:
var view = Backbone.View.extend({
className: 'list-container',
template: _.template($('#my-template').html()),
initialize: function () {
this.listenTo(this, 'render', function () {
console.info('actions');
});
},
render: function() {
this.$el.html(this.template(this));
return this;
},
});
然后:
var myView = new view();
myView.render();
myView.trigger('render');
$('#container').html(myView.el);
var View = Backbone.View.extend({
events: {
'render .myselector': 'playerRendered'
},
playerRendered: function( e ) {
console.log("arguments");
var playerValue = e.currentTarget.getAttribute( 'value' );
// HERE: e.currentTarget I've particular player
},
render:function(){
console.log("render");
this.$el.html("<div class='myselector'></div>");
}
});
var view = new View();
view.render();
您可以使用 Jquery trigger
触发 this.$(".myselector").trigger("render");
或在您的视野之外
view.$(".myselector").trigger("render");