2012-06-01 17 views
5

me gustaría poner en práctica una animación reversible en la espina dorsal, de la misma manera que lo hacemos en jQuery:de palanca en eventos Backbone.js

$('a.contact').toggle(
function(){ 
    // odd clicks 
}, 
function(){ 
    // even clicks 
}); 

mi pregunta es cómo hacer esto en la sintaxis caso de la columna vertebral ? ¿Cómo debo imitar la función, configuración de funciones?

events : { 
    'click .toggleDiv' : this.doToggle 
}, 

doToggle : function() { ??? } 

Respuesta

14

de Backbone delegar directamente a jQuery, y le dará acceso a todos los argumentos del evento DOM estándar a través del método de devolución de llamada. Por lo tanto, se puede llamar fácilmente método de palanca de jQuery en el elemento:


Backbone.View.extend({ 

    events: { 
    "click a.contact": "linkClicked" 
    }, 

    linkClicked: function(e){ 
    $(e.currentTarget).toggle(
     function() { 
     // odd clicks 
     }, 
     function() { 
     // even clicks 
     } 
    ); 
    } 

}); 
+0

Gracias @Derick Bailey! Pensé que podría hacer algo como esto, pero no se me ocurrió usar el actualTarget – Petrov

+5

. No creo que esto sea correcto @Derick. El alternar de jQuery con dos parámetros agregará un manejador de eventos de clic a e.currentTarget que llamará esas funciones en clics pares/impares. Si usa esto, cada vez que se haga clic en un contacto, se agregarán nuevos controladores. – johnkpaul

+0

uhhhh sí. No estoy seguro de lo que estaba pensando cuando respondí con eso: P –

0

¿El elemento que desea alternar dentro de la vista que recibe el evento? Si es así: Para ver los eventos

doToggle: function() { 
    this.$("a.contact").toggle() 
} 
+0

puede optimizar esto, porque doToggle se produce durante el clic. Obtuviste 'event.target' como el elemento objetivo de clic para que' toggle: function (ev) {$ (ev.target) .toggle()} 'debería funcionar bien – Deeptechtons

0

En realidad creo que la única hacer esto utilizando events es añadir un trigger con el fin de mantener el flujo real juntos. Parece ser un poco torpe ser honesto al tener que cambiar de esta manera.

Backbone.View.extend({ 

    events: { 
    "click .button": "doToggle" 
    }, 

    doToggle: function(e){ 
    var myEle = $(e.currentTarget); 
    $(e.currentTarget).toggle(
     function() { 
     // odd clicks 
     }, 
     function() { 
     // even clicks 
     } 
    ); 
    myEle.trigger('click'); 
    } 

}); 

Es probablemente más limpia de usar simplemente

Backbone.View.extend({ 

    el: '#el', 

    initalize: function() { 
    this.render(); 
    }, 

    doToggle: { 
    var myEle = this.$el.find('.myEle'); 
    myEle.toggle(
     function() { 
     // odd clicks 
     }, 
     function() { 
     // even clicks 
     } 
    ); 
    }, 

    render: function(e){ 


    //other stuff 

    this.doToggle(); 

    return this; 
    } 

}); 
4

que estaba buscando una solución a este problema y acabo de ir sobre él de la manera antigua. También quería poder localizar mi método hideText() desde otras vistas en mi aplicación.

Así que ahora puedo verificar el estado de 'showmeState' desde cualquier otra vista y ejecutar hideText() o showText() dependiendo de lo que quiero hacer con él. Intenté simplificar el siguiente código eliminando elementos como renderizar e inicializar para que el ejemplo sea más claro.

var View = Backbone.View.extend({ 
    events: { 
    'click': 'toggleContent' 
    }, 
    showmeState: true, 
    toggleContent: function(){ 
    if (this.showmeState === false) { 
     this.showText(); 
    } else { 
     this.hideText(); 
    } 
    }, 
    hideText: function() { 
    this.$el.find('p').hide(); 
    this.showmeState = false; 
    }, 
    showText: function() { 
    this.$el.find('p').show(); 
    this.showmeState = true; 
    } 
}); 

var view = new View(); 
+0

Esto funciona sin problemas. La respuesta aceptada no funcionó correctamente para mí, al menos, donde tuve varios eventos de alternar para la misma clase en ejecución. – iankit

Cuestiones relacionadas