Question

Je crée un objet JS personnalisé. Cet objet effectue une action. Je veux être en mesure d'informer le consommateur de l'objet (en déclenchant des événements personnalisés) qui action sera effectuée et action est déjà exécuté. (Ce modèle de comportement est connu dans ASP.NET où les contrôles ont des événements onBeforeAction et onAfterAction).
La partie la plus délicate est que je voudrais consommateur d'être en mesure d'arrêter / interrompre la séquence d'événements.

Voici un algorithme (en # humaine) de comportement souhaité:

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

Avoir cette fonctionnalité dans mon objet permettrait consommateur de faire quelque chose comme ceci:

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

Toutes les idées sur la façon de mettre en œuvre une séquence d'événements « contrôlable » serait génial.
Merci à l'avance.
// R

Était-ce utile?

La solution 2

Je crois que je l'ai trouvé solution.
Voici ce que je suis venu avec:

// 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"
    }
}

Ensuite, certains consommateurs pourraient agir comme ceci:

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);
    });

J'ai couru ce dans FireFox avec Firebug (bien sûr). L'exécution carUnderControl.goFaster(); de la console Firebug trois fois montré Vitesse actuelle: ... un message trois fois. exécutions ultérieures de méthode goFaster() ont montré Augmentation de la vitesse empêché message.

C'est la fonctionnalité que je voulais atteindre.
Toutes les recommandations sur la façon d'améliorer ce sont les bienvenus beaucoup.

Merci

Autres conseils

(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);

Remplacez cliquez avec votre nom d'événement personnalisé:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top