2011-08-19 10 views
5
var UserView = Backbone.View.extend({ 
     initialize: function(){ 
      MData.blankHeader.data.topBar.title = '<h1 id="titleLogo">' + this.options.userName + '</h1>'; 
      MData.blankHeader.data.topBar.btn1 = ''; 
      MData.blankHeader.data.topBar.btn2 = '<a href="#" id="sendDm" class="cu-round-btn">发私信</a>'; 
      $('header').html(Mustache.to_html($('#headerTpl').html(), MData.blankHeader)).append('<div class="topbar-shadow"></div>'); 
      $('footer').html(Mustache.to_html($('#footerTpl').html(), MData.eventlistFooter)).attr('id','').find('.selected').removeClass('selected').end().find('.footer-item:eq(3)').addClass('selected'); 
      $('#content').css({"top": $('header').height() + 'px'}); 
      setTimeout(function(){ 
       scrollinit(); 
      },0); 
      onScrollEnd = true;//?? 
      this.render(); 
     }, 

     events:{ 
      "click #sendDm" : "sendDm" 
     }, 

     el: $('body'), 

     sendDm: function(e){ 
      alert('send dm'); 
      e.preventDefault(); 
     }, 

     render: function(){ 
      var html = ""; 
      html += Mustache.to_html($("#userTpl").html(), this.options.userData); 
      $('#pullDown').css("display","none"); 
      $('#ajaxEvent').html(html); 
      console.log(this.options.userId); 
      if(this.options.userName != "me"){ 
       $('#dm').remove(); 
      } 
      calTime(); 
      function calTime(){ 
       _.each($('.user-timeStamp'), function(date){ 
        $(date).html(humaneDate(date.innerHTML)); 
       }); 
      } 
      setInterval(calTime,60000) 
      return this; 
     } 
    }); 



//code in Router 
    var newUser = new UserCol();//new a Collection 
        newUser.fetch({ 
         data: param, 
         success: function(model,data){ 
          new UserView({userData: data, userId: param}) 
         } 
        }) 

Così, quando ho visualizzare questa pagina a più volte (cambiare il parametro nella barra degli indirizzi), la spina dorsale sarà nuovi il multi tempi UserView, e l'associazione dell'evento to to button will fire multi time, Come posso far scattare il pulsante una volta sola.spina dorsale si legano a più eventi a un pulsante dopo che Nuova vista a più volte

+0

è necessario inserire il codice per la vostra UserView –

risposta

8

avete una perdita di memoria e vista zombie oggetti

events in vista dorsale vengono ambito al el specificata (o generato per voi). poiché è stato specificato el come body, l'evento click #sendDm troverà qualsiasi istanza di un elemento con un ID di sendDm.

quando si modifica il percorso nell'url, il router sta raccogliendo la modifica e caricando la vista ... tuttavia la vista precedente non viene mai chiusa o rimossa correttamente, quindi si rimane con un oggetto vista zombie appeso in memoria, associato all'evento click dell'elemento #sendDm. ogni volta che ti sposti su una nuova rotta e carichi un'altra vista, ti stai lasciando dietro un'altra forma di zombi legata a quell'elemento.

non specificare body come el. Inoltre, non chiamare this.render() dal metodo di inizializzazione della visualizzazione. invece, hanno il router di gestire la conoscenza di body e farlo rendere la vista, ma anche la rimozione di vecchie idee:

var newUser = new UserCol();//new a Collection 

MyRouter = Backbone.Router.extend({ 
    routes: {"some/route/:id": "showIt"}, 

    initialize: function(){ 
    _.bindAll(this, "showUser"); 
    } 

    showIt: function(id){ 
    newUser.fetch({ 
     data: param, 
     success: this.showUser 
    }); 
    }, 

    showUser: function(model,data){ 
    if (this.userView){ 
     this.userView.unbind(); 
     this.userView.remove(); 
    } 
    var view = new UserView({userData: data, userId: param}); 
    view.render(); 
    $('body').html(view.el); 
    this.userView = view; 
    } 
}); 
+0

grazie per il vostro consiglio. –

Problemi correlati