Code behind depuis une instance en AS3
Bonjour,
Je cherche a créer des Panels ou autre TitleWindow a la volée, cela ne pose pas de probleme, dans une fonction AS3 je fait :
Code:
1 2 3 4 5 6 7
|
public function onNewWindow():void
{
var oPanel:Panel = new Panel;
mx.managers.PopUpManager.addPopUp(oPanel, this, false);
} |
Maintenant, je veut faire pareil avec un custom component, qui utilise le code behind.
fichier MenuTest.mxml
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| <?xml version="1.0" encoding="utf-8"?>
<comp:MenuTestClass
xmlns:comp="components.*"
xmlns:mx="http://www.adobe.com/2006/mxml"
>
<mx:Canvas>
<mx:Button label="Sauvegarder" id="btnSave" />
</mx:Canvas>
</comp:MenuTestClass> |
Fichier MenuTestClass.as
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
package components
{
import mx.controls.*;
import mx.containers.*;
import mx.events.FlexEvent;
public class MenuTestClass extends TitleWindow
{
public var btnSave:Button;
public function MenuTestClass() {
btnSave.addEventListener("click", onSave);
this.title = "Settings";
this.alpha = 0.98;
this.percentHeight = 100;
this.percentWidth = 100;
this.x = 320;
this.y = 90;
}
private function onSave():void {
Alert.show("onSave");
// etc
}
}
} |
Voici le probleme : Apparemment, le code behind est effectif uniquement si le composant est instanciée en mxml
Application principale :
Code:
1 2 3 4 5 6
|
...
<MenuTest>
....
<MenuTest/>
... |
Ceci ne m'intéresse pas, car comme dit le composant est crée a la volé, en reprenant le premier exemple, mais avec utilisation du custom component.
en utilisant le nom de la class AS
Code:
1 2 3 4 5 6
|
public function onNewWindow():void
{
var oTest:MenuTestClass = new MenuTestClass ;
mx.managers.PopUpManager.addPopUp(oTest, this, false);
} |
Résultat :
Citation:
TypeError: Error #1009: Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul.
at components::MenuTestClass()[...\src\components\MenuTestClass.as:13]
Ce qui veut dire que le btnSave n'est pas instancié, mais juste définit, le code behind n'est plus effectif et la fenetre n'est pas affiché, car on ne passe pas par le code mxml. Cela marche si j'instancie btnSave = new Button et que je l'ajoute avec un this.addChild(btnSave). Comme pour creer un compsant uniquement en AS (le mxml est donc ignoré)
Quand je commente la ligne 13 (btnSave.addEventListener("click", onSave); ) la titleWindow s'affiche sans composants a l'intérieur.
____________________________________________________________
En utilisant le nom du fichier mxml, comme on le ferai dans une instanciation en mxml.
Code:
1 2 3 4 5 6
|
public function onNewWindow():void
{
var oTest:MenuTest = new MenuTest ;
mx.managers.PopUpManager.addPopUp(oTest, this, false);
} |
Quand je commente la ligne 13 (btnSave.addEventListener("click", onSave); ) la titleWindow s'affiche avec les composants, mais bien sur la fonction onSave ne peut etre appelle.
Alors, le code behind n'est pas supporté depuis l'action script ? d'ailleurs dans le tuto d'adobe http://www.adobe.com/devnet/flex/qui...g_code_behind/ le composant est bien instancié en mxml
Dernière remarque, le code behind fonctionne uniquement pour l'instance (this) du composant, ainsi un this.title = "Quarante deux "; changera bien le titre, mais les membres ne sont pas bindé.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<?xml version="1.0" encoding="utf-8"?>
<custom:ApplicationClass
xmlns:custom="components.*"
viewSourceURL="src/CodeBehind/index.html"
width="400" height="310"
>
<custom:PaddedPanel title="Code Behind">
<custom:AddressForm id="addressForm"/>
</custom:PaddedPanel>
</custom:ApplicationClass> |