2012-06-15 9 views
7

Ho una vista backbone che carica la visualizzazione secondaria. Quando carico una sottoview, vorrei mostrare un loader quando la vista recupera i dati necessari e nasconde il loader quando la vista è pronta per il rendering.Visualizzazione backbone, inizializzazione e rendering

ho fatto qualcosa di simile:

var appView = Backbone.View.extend({ 
    showLoader: function() { 
     // Code to show loader 
    }, 

    hideLoader: function() { 
     // Code to hide loader 
     }, 

    loadSubView: function() { 
     this.showLoader(); 
     var myView = new MySubView(); 
     this.$el.html(myView.render().el); 
     this.hideLoader(); 
    } 
}); 

Per ora, il mio sub-vista caricare una raccolta e viene implementato in questo modo:

var mySubView = Backbone.View.extend({ 
    initialize: function() { 
     this.myCollection.fetch({ 
      async: false 
     }); 
    }, 

    render: function() { 
     // Code to render 
    } 
}); 

mio punto di vista sub caricare la raccolta in modo sincrono perché è l'unico modo che ho trovato per sapere quando il mio punto di vista è "pronto" per il rendering, ma penso che questo non sia il modo migliore per usare Backbone.

Che schould devo fare?

+0

Senza offesa, penso che dovresti leggere/imparare un po 'più sulla programmazione asincrona. Non è una questione fondamentale, è un concetto di programmazione che dovrai padroneggiare. –

+0

So cosa significa sincrono o asincrono. Se posso fare di nuovo la mia domanda: qual è il modo migliore per notificare alla mia vista genitore che il recupero ha avuto successo? – Mickael

risposta

15

Ci sono diversi modi per farlo.

  1. È possibile utilizzare il pattern pubsub in modo esplicito. Qualcosa di simile a questo:

    var AppView = Backbone.View.extend({ 
        showLoader: function() { 
         console.log('show the spinner'); 
        }, 
    
        hideLoader: function() { 
         console.log('hide the spinner'); 
        }, 
    
        loadSubView: function() { 
         this.showLoader(); 
         var subView = new SubView(); 
         subView.on('render', this.hideLoader); 
         this.$el.html(subView.render().el); 
    
        } 
    }); 
    
    var SubView = Backbone.View.extend({  
        render: function() { 
         console.log('a subView render'); 
         this.trigger('render'); 
         return this; 
        } 
    }); 
    
    var appView = new AppView({el: $('body')}); 
    appView.loadSubView(); 
    

    http://jsfiddle.net/theotheo/qnVhy/

  2. È possibile allegare una funzione per gli eventi ajaxStart/ajaxStop sulla filatore stesso:

    var AppView = Backbone.View.extend({ 
        initialize: function() { 
         var _this = this; 
         this.$('#spinner') 
          .hide() 
          .ajaxStart(_this.showLoader) 
          .ajaxStop(_this.hideLoader); 
        } 
        ... 
    } 
    
  3. Oppure si può utilizzare jQuery.ajaxSetup:

    var AppView = Backbone.View.extend({ 
         initialize: function() { 
          var _this = this; 
          jQuery.ajaxSetup({ 
           beforeSend: _this.showLoader, 
           complete: _this.hideLoader, 
           success: function() {} 
          }); 
         } 
        ... 
        } 
    
Problemi correlati