在 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。喜欢 clickmouseover。所以,有了这个模板:

<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");