2009-05-19 9 views
3

Je lis le livre manning - asp.net ajax en action. à la page 54-58, les délégués clients et les rappels sont décrits.ASP.NET AJAX Fonction.createDelegate vs Function.createCallback?

en bref:

avec le délégué client vous pouvez modifier dans le gestionnaire d'événement lui-même la variable this pour refléter un autre objet. (Donc il ne sera pas l'objet DOM qui a déclenché l'événement pour les événements DOM)

avec un rappel vous pouvez passer un context object à votre gestionnaire d'événements qui sera disponible dans le gestionnaire d'événements comme la seconde argument/paramètre. Avec les deux, vous pouvez "passer" un objet au gestionnaire d'événements (que ce soit this ou le context object) qui ne serait pas disponible pour le gestionnaire d'événements (dans le champ d'application). Quelle est la différence entre ces délégués clients et les rappels?

Pour moi, il semble que:

seulement l'objet vous voulez être disponible dans le gestionnaire d'événements est accessible de différentes façons:

  • délégué client : this
  • callback: second argument

... et peut-être que seul le rappel a le DomEvent (premier paramètre), mais pas le délégué client?! ??

Est-ce correct? Est-ce tout? Vous pouvez peut-être expliquer la différence entre les délégués du client et les rappels.

Répondre

3

Je ne suis pas vraiment sûr à ce sujet, mais je pense que le rappel est ce qui se passe lorsque la page est soumise au serveur.

Le délégué de création de client est là pour créer un délégué pour appeler des méthodes JavaScript.

La méthode Function.CreateDelegate() est vraiment utile.

Supposons que vous souhaitiez gérer un événement de clic sur un bouton en JavaScript. L'objet "this" disponible dans la fonction qui gère le clic sur le bouton est le bouton sur lequel vous avez cliqué.

Dites maintenant que vous avez un objet JavaScript qui capture l'événement de clic de bouton et qui fait quelque chose. Normalement, "this" fait référence à l'objet JavaScript lui-même mais puisque la méthode Object est utilisée pour gérer l'événement de clic de bouton "this" fait référence à l'objet qui a déclenché l'événement: le bouton.

Pour contourner ce problème, la méthode JavaScript apply a été créée. Ainsi, au lieu de capturer l'événement de clic de bouton en spécifiant la méthode de l'objet JavaScript dans la méthode attachEvent/attachEventListener (ou la méthode $ addHandler() dans Ajax.NET Framework), vous utiliseriez la méthode apply() avec ces attachEvent/attachEventListener. Cela modifie le contexte afin que "this" fasse référence à l'objet JavaScript au lieu de l'objet qui a déclenché l'événement.

Maintenant, la méthode Function.CreateDelegate() fait plus que simplement utiliser la méthode apply dans la création d'un délégué client.

Jetez un oeil sur le code:

Function.createDelegate = function Function$createDelegate(instance, method) { 
    /// <summary locid="M:J#Function.createDelegate" /> 
    /// <param name="instance" mayBeNull="true"></param> 
    /// <param name="method" type="Function"></param> 
    /// <returns type="Function"></returns> 
    var e = Function._validateParams(arguments, [ 
    {name: "instance", mayBeNull: true}, 
    {name: "method", type: Function} 
    ]); 
    if (e) throw e; 
    return function() { 
     return method.apply(instance, arguments); 
    } 
} 

Il y a une chose que vous devez savoir sur la méthode apply(). Lorsque vous l'exécutez, il exécute la méthode qui est le délégué. Pour contourner cela, la méthode createDelegate fait ce qui précède. Donc, je ne suis pas vraiment sûr de la manière dont un callback s'intègre à cela, mais l'utilisation de la méthode createDelegate() est une bonne idée lorsque vos objets JavaScript gèrent les événements provoqués par certains éléments de l'interface utilisateur.

Je suppose que le rappel est l'action qui a lieu lorsque la demande est envoyée par le navigateur au serveur. La plupart du temps, la méthode __doPostback est utilisée pour préformer le rappel. Cette méthode prend 2 paramètres ... l'objet qui a causé la publication/callback sur le serveur, et les arguments pour le postback/callback. Ce serait cependant quelque chose de complètement différent pour le délégué du client.

Bonne programmation

-Frinny

+0

verbeux meilleure réponse – egidiocs