2013-03-19 7 views
5

Chciałbym użyć podejścia opisanego przez Derick Bailey w "Ogólny problem Rozwiązanie" w tym thread, aby wyświetlić widok po pobraniu modelu. Opiszę tutaj jego rozwiązanie:Renderuj region Marionetek po pobraniu modelu

MyView = Backbone.View.extend({ 
    initialize: function(){ 
    this.model.on("sync", this.render, this); 
    }, 

    render: function(){ ... } 
}); 


myModel = new MyModel({id: someId}); 
new MyView({ 
    model: myModel 
}); 

myModel.fetch(); 

Mam nieco inną sytuację: mój widok znajduje się w układzie regionalnym. Jeśli zadzwonię do Marionette.Region.show() to działa, ale widok jest renderowany dwa razy. Wywołanie funkcji Marionette.Region.attachView() powoduje wyświetlenie funkcji wyświetlania widoku, ale zawartość nie jest wyświetlana na stronie.

Każdy pomysł?

+0

Jeśli używasz obszarów i widoków marionetek, widok będzie aktualizowany za każdym razem, gdy model ulegnie zmianie. Jeśli więc chcesz, aby widok był renderowany tylko jeden raz, będziesz musiał pobrać model przed wywołaniem metody show w regionie. – Kalpers

Odpowiedz

13

Można czekać, aż model jest zsynchronizowane przed renderowania widoku


var myView = new MyView({ 
    model: myModel 
}); 

myModel.on("sync", function(){ 
    myRegion.show(myView); 
}); 

myModel.fetch(); 
4

I mają pochodzić z nieco innego podejścia. Potrzebuję moich poglądów, aby załadować własne modele na initalize, więc podejście Derick nie działało dla mnie. Było kilka powodów, których nie chcę tutaj wyjaśniać. Ale przyszedłem było:

Stworzyłem domyślny szablon o nazwie ze wskaźnikiem ładowania i pokrętłem, który dołączam do szablonu widoku. Mam metodę o nazwie updateView, która jest wyzwalana, gdy model zostanie zsynchronizowany i zastąpi szablon ładowania szablonem rzeczywistym, a następnie wywoła metodę render().

Może ktoś również uzna to za przydatne.

var myView = new MyView({ 
    template: loader, 
    initialize : function(){ 
     this.model = new MyModel(); 
     this.model.on("sync", this.updateView, this); 
     this.model.fetch(); 
    }, 
    updateView : function(){ 
     this.template = myTemplate; 
     this.render(); 
    } 
}); 
+0

Hmm, co by się stało, gdyby pobieranie zakończyło się podczas fazy renderowania (pomiędzy renderowaniem, wyświetlaniem, dołączaniem zdarzeń)? Czy nie spowoduje to dziwnych problemów, takich jak widok dwukrotnie dołączany do DOM lub wiele programów obsługi zdarzeń? – alekop

+0

Ponieważ javascript jest pojedynczym wątkiem, powiązanie renderowania i zdarzenia zakończy się, zanim zostanie uruchomione inne. – nxtwrld