2008-11-26 4 views
12

D'après ce que je comprends, la liaison à un var dans ActionScript est effectuée via des événements qui sont déclenchés automatiquement quand un var est modifié. Je ai quelques questions à ce sujet:Comment fonctionne la liaison dans ActionScript?

  1. Que se passe-t-il si la classe ne s'étend pas explicitement EventDispatcher? Y a-t-il une sorte de magie qui se passe dans le compilateur qui fait essentiellement de la classe un EventDispatcher?
  2. Comment fonctionne la liaison aux vars statiques? Une sorte de fonction addEventListener() statique implicite est-elle ajoutée à la classe?
  3. J'ai remarqué que vous pouvez mettre [Bindable] sur des vars statiques mais pas des fonctions statiques, pourquoi?

Edit:

Merci à Christophe Herreman pour sa réponse éclairante. Cependant, j'ai quelques suites de mes questions ci-dessus. Je me demande si quelqu'un pourrait combler les lacunes pour moi (j'ai essayé de numéroter ces questions 4, 5, 6 mais ils apparaissent 1, 2, 3 pour une raison quelconque!)

  1. J'ai ajouté l'option -keep au compilateur et j'ai regardé le code de liaison généré. Quelqu'un pourrait-il expliquer comment ce code est appliqué? Le compilateur semble générer une classe appelée BindableProperty pour chaque classe, qui contient le getter et le setter. Comment cela se plie-t-il dans la classe que j'ai écrite? La fonctionnalité ressemble un peu à des classes partielles en C# - est-ce une fonctionnalité de compilateur exclusivement en coulisses, ou est-ce quelque chose que je pourrais utiliser moi-même?

  2. La classe BindableProperty n'implémente pas explicitement EventDispatcher, comment la classe générée implémente-t-elle la distribution d'événements?

  3. Dans la question 3, j'ai posé une question sur la liaison aux fonctions statiques, mais je voulais dire en fait des fonctions de getter et de setter statiques. Cela ne semble pas être autorisé.

Répondre

14

Les liaisons fonctionnent en effet via la répartition d'événements. Vous pouvez apprendre beaucoup du code ActionScript généré en ajoutant l'indicateur -keep aux paramètres du compilateur.

Je vais essayer de répondre à vos questions.

  1. le compilateur choisira la balise de métadonnées [Bindable] et créera un getter et setter pour chaque propriété que vous avez marqué comme bindable. Le getter retournera simplement la valeur de la propriété. Le setter vérifiera si la nouvelle valeur diffère de la valeur d'origine et enverra un événement PropertyChange s'il le fait.

  2. de la même manière que pour les propriétés d'exemple, seulement maintenant un getter statique et un setter sont créés. En outre, un mx.binding.StaticPropertyWatcher est créé pour observer les modifications dans les propriétés statiques. Lors de la liaison à une méthode statique, vous obtenez l'avertissement suivant: "[Bindable] nécessite un paramètre de nom d'événement lorsqu'il est appliqué à une fonction qui n'est pas un getter ou un accesseur." La description dit à peu près tout. Puisque vous n'avez pas d'événement "propertyChange" déclenché spécifiquement pour cette méthode, vous devez en envoyer un personnalisé. C'est [Bindable (event = "customEvent")] et ensuite distribuer cet événement de quelque part dans votre classe.

+0

Merci Chris, c'est une explication très utile. – aaaidan

Questions connexes