Как указать обратный вызов метода, когда представление Backbone вставляется в DOM?

Мне нужно запустить сценарий макета, как только мои представления будут вставлены в DOM. Так...

$(".widgets").append(widgets.render().el)
$(".widgets .dashboard").isotope # <-- This needs to be called whenever new widgets are inserted

Проблема в том, что мне нужно вставить новые виджеты в несколько разных представлений и повторно вызвать этот скрипт в нескольких разных местах, что не является СУХИМ. Мне интересно, как я могу определить isotope в классе View.

Было бы неплохо определить прослушиватель событий, чтобы следить за добавлением в «.widgets» и запускать скрипт? Есть ли встроенный способ создания представлений, которые эффективны при добавлении в DOM?

(Если на то пошло, было бы также полезно определить обратный вызов, когда представление удаляется из DOM.)


person picardo    schedule 06.03.2012    source источник
comment
Возможный обман stackoverflow.com/questions/1324647/   -  person tkone    schedule 06.03.2012
comment
Я не думаю, что это дубликат. Я ищу решение, основанное на Backbone, но спасибо за эту ссылку.   -  person picardo    schedule 06.03.2012
comment
Что ж, решение состоит в том, что вы прикрепляете прослушиватель к вашему представлению, который вызывает this.isotope при вставке. Таким образом, вы добавляете (widget.render().el) туда, куда нужно. Функция инициализации виджета связывает метод isotope с событием вставки DOM. Это настолько укоренено в магистральной сети, насколько это возможно, тем более, что в магистральной сети нет встроенных средств для этого. Я говорю, что это обман, потому что то, что вы хотите сделать, это что-то сделать, когда Дом будет изменен. Независимо от вашей структуры, это суть сводилась к нулю (если я что-то не пропустил)   -  person tkone    schedule 06.03.2012


Ответы (2)


Как насчет того, чтобы вызывать изотоп каждый раз, когда представление rendered? Вам нужно быть осторожным, вызывая render() только после внедрения виджета, но это должно решить вашу проблему:

 //in Backbone.view.extend({
   initialize: function() {
     // fix context for `this`
     _.bindAll(this);
   },
   render: function() {
     // .. do rendering..
     this.isotope();
     return this;
   }
 // }) // end .extend
person rjz    schedule 06.03.2012
comment
Я пробовал это. Проблема в том, что HTML не будет в DOM, пока он не будет добавлен родительским представлением. - person picardo; 06.03.2012
comment
Может нужно разбить вставку на два этапа? widgets.render(); $(".widgets").append(widgets.el) - person rjz; 06.03.2012

использовать:

var self = this;    
this.$el.on('DOMNodeInserted', function(evt){   
self.isotope();
$(evt.target ).stopPropagation();
})
person norbertas.gaulia    schedule 06.02.2013