2015-11-11 2 views
0

У меня есть один вопрос о Backbone.View и его delegateEvents. Вы можете прочитать в документах here о методе extend. Используя этот метод, вы можете «переопределить функцию визуализации, указать ваши декларативные события» т.д.Ищете событие render в делегатеEvents в Backbone.View

У меня есть вопрос о декларативной события или 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 

} 

Как я могу это сделать? Потому что render в delegateEvents не работает:/

ответ

0

Возможно, в функции инициализации в вашем представлении вы можете прослушивать с помощью рендеринга. Нечто подобное:

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