2010-07-06 7 views
0

Je sais qu'il y a beaucoup de questions similaires à cela, mais je les ai toutes essayées en vain ... alors merci pour toute aide.Passer des paramètres dans les événements d'objet JavaScript en utilisant jQuery

CE QUE J'essaie de faire: Je veux passer un à de nombreux paramètres dans chacun des cases à cocher de clic 'événement lors de l'enregistrement (voir ci-dessous).

CE QUI FONCTIONNE: , je peux enregistrer l'événement sans aucun paramètre, et l'événement click soulève ... mais je dois passer dans une référence à l'objet contenant de la grille JavaScript (pour d'autres raisons).

CE QUI MANQUE J'ai essayé diverses formes de "this.MutuallyExclusiveCheckBoxHandler = function (grille) {}" en vain.

Une idée: I « pense » curryfication peut être la réponse, mais je ne sais pas comment le faire bien assez (encore).

Cette zone instantie la grille et enregistre les cases

<script type="text/javascript"> 
<!-- 
    // CLASS 
    function CommitImporterGrid() { 
     // PROPERTIES 
     this.Toaster = new Toaster(); 
     this.CheckBoxes = new Array(); 

     // METHODS 
     this.RegisterMutuallyExclusiveCheckBox = function(clientId) { 

      var checkBox = $j('input:checkbox#' + clientId); 

      // HERE: "I need to pass a reference to the grid somehow" 
      $j(checkBox).click(this.MutuallyExclusiveCheckBoxHandler); 

      this.CheckBoxes.push(checkBox); // Append to array 
     } 
     this.MutuallyExclusiveCheckBoxHandler = function() { 

      // The checkbox events break when I try to add a parameter. 
      var myGrid = "I need to retreive the grid reference here somehow"; 

      if (!$j(this).is(':checked')) { // They clicked on the same checkbox 
       this.checked = true; 
       return; 
      } 

      // ...other code... 
     } 
    } 

    // CLASS INSTANCE 
    var myGrid = new CommitImporterGrid(); 

    // DOM EVENT: Document.Ready() 
    $j(document).ready(function() { 

     // DYNAMIC REGISTRATION 
     myGrid.RegisterMutuallyExclusiveCheckBox('chkCommitImporter01'); 
     myGrid.RegisterMutuallyExclusiveCheckBox('chkCommitImporter02'); 
    }); 
--> 
</script> 

Répondre

1

Utilisez .bind() et transmettre des données d'événements (en supposant que votre grille est l'objet courant):

// HERE: "I need to pass a reference to the grid somehow" 
checkBox.bind('click', {grid: this}, this.MutuallyExclusiveCheckBoxHandler); 

(vous n'avez pas besoin de passer checkbox à jQuery, il est déjà un objet jQuery)

et changer votre méthode pour:

this.MutuallyExclusiveCheckBoxHandler = function(event) { 
     var mygrid = event.data.grid; 
     //... 
} 

(Vous pouvez accéder les données d'événement via event.data)

+0

Ceci n'obtiendra pas le bon 'this'. – SLaks

+0

@SLaks: Pourquoi? Il devrait, autrement, 'this.MutuallyExclusiveCheckBoxHandler' ne fonctionnera pas non plus. –

+0

A l'intérieur du gestionnaire, 'this' sera l'élément DOM. – SLaks

0

Vous devez ajouter une fonction anonyme qui appelle votre gestionnaire avec vos paramètres, comme ceci:

this.RegisterMutuallyExclusiveCheckBox = function(clientId) { 
    var self = this; 

    var checkBox = $j('input:checkbox#' + clientId); 

    $j(checkBox).click(function() { 
     self.MutuallyExclusiveCheckBoxHandler(parameters); 
    }); 

    this.CheckBoxes.push(checkBox); // Append to array 
}; 

dans l'événement gestionnaire, this fait référence à l'élément qui a déclenché l'événement.
J'utilise donc une variable distincte self à la place.

Questions connexes