2011-08-19 8 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}) 
         } 
        }) 

Więc kiedy zobaczyć tą stronę obsługujący kilka razy (zmienić param w pasku adresu), szkielet Czy nowe na UserView wielo- krotnie, a wiążą wydarzenie Przycisk "do" będzie uruchamiać się wielokrotnie, . Jak mogę sprawić, że przycisk zostanie jednorazowo zwolniony.kręgosłup wiążą Multi Event do jednego przycisku po tym jak nowy widok czasy Multi

+0

trzeba pisać kod dla UserView –

Odpowiedz

8

masz wyciek pamięci i widok zombie obiektów

events w widoku szkieletowym są zawężona do el, która jest określona (lub wygenerowany dla Ciebie). ponieważ podałeś el jako body, zdarzenie click #sendDm znajdzie dowolne wystąpienie elementu o identyfikatorze sendDm.

po zmianie trasy w adresie URL, router podnosi zmianę i ładuje widok ... jednak stary widok nigdy nie jest zamykany lub usuwany poprawnie, więc pozostaje ci tylko widok obiektu zombie w pamięci powiązane z kliknięciem elementu #sendDm. za każdym razem, gdy przechodzisz na nową trasę i ładujesz inny widok, pozostawiasz kolejną postać zombie związaną z tym elementem.

Nie podawaj body jako numeru el. również - nie wywołuj this.render() z metody inicjowania widoku. Zamiast mieć router obsługiwać wiedzę body i go renderować widoku, a także usuwania starych poglądów:

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

dziękuję za radę. –