Pregunta

Estoy creando un objeto JS personalizado. Este objeto realiza algunos action. Quiero poder notificar al consumidor del objeto (activando eventos personalizados) que action será realizado y action ya está realizado. (Este modelo de comportamiento se conoce en ASP.NET donde los controles tienen onBeforeAction y onAfterAction eventos).
La parte difícil es que me gustaría que el consumidor pueda detener/interrumpir la secuencia del evento.

Aquí hay un algoritmo (en#humano) de comportamiento deseado:

this.trigger('onBeforeAction');
if (!onBeforeAction.wasCanceled){
  this.doAction();
  this.trigger('onAfterAction');
}

Tener esta funcionalidad en mi objeto permitiría al consumidor hacer algo como esto:

$(myIntance).bind('onBeforeAction', function(){
  if (!someCondition.satisfied)
    return false;
  return true;
});
$(myIntance).bind('onAfterAction', function(){
  // respond to action here
});

Cualquier idea sobre cómo implementar una secuencia de eventos 'controlable' sería excelente.
Gracias por adelantado.
// r

¿Fue útil?

Solución 2

Supongo que he encontrado solución.
Esto es lo que se me ocurrió:

// my object
function Car(){
    this.currentSpeed = 0;
}

Car.prototype.goFaster = function(){
    var event = $.Event('beforeSpeedIncrease'); 
    $(this).trigger(event); // notify "onBeforeAction"
    if (!event.isDefaultPrevented()){
        this.currentSpeed += 10; // actual action
        $(this).trigger('afterSpeedIncreased'); // notify "onAfterAction"
    }
}

Entonces algún consumidor podría actuar así:

var speedLimit = 30;

var carUnderControl = new Car();

$(carUnderControl)
    .bind('beforeSpeedIncrease', function(e){
        if (carUnderControl.currentSpeed >= speedLimit){
            e.preventDefault();
            console.log('Speed increase prevented, current speed: ' + carUnderControl.currentSpeed);
        }
    })
    .bind('afterSpeedIncreased', function(){
        console.log('Current speed: ' + carUnderControl.currentSpeed);
    });

He ejecutado esto en Firefox con Firebug (por supuesto). Ejecutivo carUnderControl.goFaster(); de la consola de Firebug por tres veces se demostró Velocidad actual: ... mensaje tres veces. Ejecuciones posteriores de goFaster() Método mostrado Aumento de la velocidad evitado mensaje.

Esa es la funcionalidad que quería lograr.
Cualquier recomendación sobre cómo mejorar esto es muy bienvenido.

Gracias

Otros consejos

(function ($) {
  var origin = $.fn.click;
  $.fn.click = function(event) {
    //before function 
     origin.call(this, event);
     //after function 
     // remember to use return as this could help with jq chainability 
  };
})(jQuery);

Reemplace Haga clic con el nombre de su evento personalizado :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top