2013-06-14 11 views
18

Jestem nowy w Marionette.js i podczas gdy refactoruję istniejący kod Backbone.js, zauważyłem, że są dwa wywołania zwrotne w widoku marionetek (itemview), które wyglądały mi podobnie, tj. OnRender i onShow. Jaka jest różnica i lepszy sposób ich używania?marionette.js różnica widoków między onShow vs onRender?

Jednak patrząc na kod źródłowy, myślę, że zarówno zdarzenia "renderuj", jak i "pokaż" są zgłaszane w "inicjowaniu widoku".

constructor: function(){ 
    _.bindAll(this, "render"); 

    var args = Array.prototype.slice.apply(arguments); 
    Backbone.View.prototype.constructor.apply(this, args); 

    Marionette.MonitorDOMRefresh(this); 
    this.listenTo(this, "show", this.onShowCalled, this); 
} 

Odpowiedz

18

onShow: widok sam w sobie nie wyzwala zdarzenia "pokaż". Wyzwala przez region. W niektórych przypadkach nie będzie to wywoływane.

onRender: ta metoda jest wykonywana przy każdym renderowaniu widoku.

+0

Czy jesteś pewien? Gdzie znalazłeś tę informację? –

+0

dzięki .. i to ma sens – addisu

+0

Jednak patrząc na kod źródłowy, myślę, że zarówno zdarzenia "renderuj" i "pokaż" są wywoływane wewnątrz "widoku zainicjować" .... ' Konstruktor: function() { _. bindAll (this, "render"); var args = Array.prototype.slice.apply (argumenty); Backbone.View.prototype.constructor.apply (this, args); Marionetka.MonitorDOMRefresh (this); this.listenTo (to, "pokaż", this.onShowCalled, to); } ' – addisu

6

Cóż, jest to metoda w Marionette show i wyjaśnia kwestię

show: function(view){ 

     this.ensureEl(); 

     var isViewClosed = view.isClosed || _.isUndefined(view.$el); 

     var isDifferentView = view !== this.currentView; 

     if (isDifferentView) { 
     this.close(); 
     } 

     view.render(); 

     if (isDifferentView || isViewClosed) { 
     this.open(view); 
     } 

     this.currentView = view; 

     Marionette.triggerMethod.call(this, "show", view); 
     Marionette.triggerMethod.call(view, "show"); 
    } 
40

myślę, że jest coś nie całkowicie poprawne odpowiedzi Vitaliy za. Prawidłowe będzie:

onShow: widok sam w sobie nie wyzwala zdarzenia "pokaż". Wyzwala przez region. W niektórych przypadkach nie będzie to wywoływane.

onRender: ta metoda jest wykonywana przy każdym renderowaniu widoku.

Zauważ, że „onRender” wykonywane nie znaczy, że obiekt jest faktycznie dodane do DOM. To po prostu oznacza, że ​​właśnie wydanego (dane wypełniony szablon, masz to. $ El do czynienia, itd.)

Z drugiej strony, jeśli „onShow” nazywa bo „koncert Zdarzenie "" zostało wywołane z regionu, a ponieważ regiony zazwyczaj reprezentują element w DOM, można się spodziewać, że po wywołaniu "onShow", widok rzeczywiście zostanie dodany do DOM.

+1

Jest to prawdą, stwierdzenie, że onRender wystrzeliwuje po wstawieniu elementu do DOM, wprowadza w błąd i wprowadzi w błąd wiele osób. –

+2

Dlaczego nie poprawić odpowiedzi? –

+2

Przepraszam, nie wiedziałem, że mogę to zrobić:/ Po prostu edytuję odpowiedź i zmieniam ją, czy muszę zrobić coś więcej? Ponownie, przepraszam :( –

0

W wersji 3 wydarzenia regionu pokazują się i poprzednio: show nie jest już uruchamiane w widoku. Możesz użyć renderowania i przed: renderować zdarzenia w większości przypadków. Jeśli trzeba wiedzieć, że widok jest w DOM następnie można użyć dołączyć lub dom: odświeżyć

informacji http://blog.marionettejs.com/2016/08/23/marionette-v3/index.html