Кто-нибудь знает, какое событие будет запущено после визуализации представления в backbone.js?
Событие Backbone.js после завершения view.render()
Ответ 1
Насколько я знаю - ни один не запущен. Функция Render пуста в исходном коде.
Реализация рендеринга по умолчанию - это no-op
Я бы порекомендовал просто запускать его вручную, когда это необходимо.
Ответ 2
Я столкнулся с этим post, который кажется интересным
var myView = Backbone.View.extend({
initialize: function(options) {
_.bindAll(this, 'beforeRender', 'render', 'afterRender');
var _this = this;
this.render = _.wrap(this.render, function(render) {
_this.beforeRender();
render();
_this.afterRender();
return _this;
});
},
beforeRender: function() {
console.log('beforeRender');
},
render: function() {
return this;
},
afterRender: function() {
console.log('afterRender');
}
});
Ответ 3
Или вы можете сделать следующее, что должно быть похоже на базовый код (шаблон Observer, aka pub/sub). Это путь:
var myView = Backbone.View.extend({
initialize: function() {
this.on('render', this.afterRender);
this.render();
},
render: function () {
this.trigger('render');
},
afterRender: function () {
}
});
Изменить: this.on('render', 'afterRender');
не будет работать, потому что Backbone.Events.on
принимает только функции. Магия .on('event', 'methodName');
стала возможной благодаря Backbone.View.delegateEvents
и как таковая доступна только с событиями DOM.
Ответ 4
Если вы используете Marionette, Marionette добавляет события show
и render
к представлениям. См. fooobar.com/questions/193048/... для примера.
С одной стороны, Marionette добавляет множество других полезных функций, которые могут вас заинтересовать.
Ответ 5
Вместо добавления обработчика событий вручную для рендеринга при иналинизации вы также можете добавить событие в раздел "События" вашего представления. См. http://backbonejs.org/#View-delegateEvents
например.
events: {
'render': 'afterRender'
}
afterRender: function(e){
alert("render complete")
},
Ответ 6
constructor: function(){
Backbone.View.call(this, arguments);
var oldRender = this.render
this.render = function(){
oldRender.call(this)
// this.model.trigger('xxxxxxxxx')
}
}