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

Así que cuando visualización de esta página veces múltiples (cambiar el parámetro en la barra de direcciones), la cadena principal nuevos los tiempos múltiples UserView, y el enlace de eventos El botón to to disparará varias veces, ¿Cómo puedo hacer que el botón solo se dispare una vez?columna vertebral se unen evento de varios a un botón después de que nuevos Ver tiempos múltiples

+0

que necesita para enviar el código para su UserView –

Respuesta

8

que tienen una pérdida de memoria y la vista zombi objetos

events en una vista espina dorsal están en el ámbito de la el que se especifica (o generada por usted). ya que ha especificado el como body, el evento click #sendDm encontrará cualquier instancia de un elemento con una identificación de sendDm.

cuando cambia la ruta en la url, el enrutador capta el cambio y carga la vista ... sin embargo, la vista anterior nunca se cierra o se elimina correctamente, por lo que se queda con un objeto con vista zombie colgando alrededor de la memoria, vinculado al evento click del elemento #sendDm. Cada vez que te mueves a una nueva ruta y cargas otra vista hacia arriba, estás dejando atrás otra forma de zombi, ligada a ese elemento.

no especifique body como su el. también - no llame al this.render() desde el método de inicialización de su vista. en cambio, tiene su router manejar el conocimiento de body y lo han renderizar la vista, y al mismo tiempo la eliminación de viejos puntos de vista:

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

gracias por su consejo. –

Cuestiones relacionadas