在Backbone.View

时间:2015-11-11 23:51:19

标签: javascript jquery backbone.js marionette backbone-views

我有一个关于Backbone.View及其delegateEvents的问题。您可以阅读有关extend方法的文档here。使用此方法,您可以“覆盖渲染功能,指定声明性事件”等。

我对声明性事件 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不起作用:/

2 个答案:

答案 0 :(得分:0)

也许在视图中的initialize函数中,您可以使用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);

答案 1 :(得分:0)

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