2009-05-18 6 views
3

Hier ist die Klasse:Wie fülle ich erforderliche Parameter in einem benutzerdefinierten MXML-Tag?

package fnc { 
    import mx.containers.Canvas; 

    public class Deck extends Canvas { 

     protected var _chipCount:int; 

     public function Deck(chipCount:int) { 
      /* Associate some chips with this deck */ 
      _chipCount = chipCount; 
     } 

     public function get chipCount():int { 
      return _chipCount; 
     } 
    } 
} 

Hier ist der MXML:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="fnc.*"> 
    <ns1:Deck horizontalCenter="0" verticalCenter="0"> 
    </ns1:Deck> 
</mx:Application> 

Ausführen dieser Anwendung dieser Fehler wird:

Argumenterror: Error # 1063: Mismatch Argument Zahl auf FNC :: Deck (). Erwartete 1, erhalten 0. bei mx.core :: Container/createComponentFromDescriptor() [C: \ autobuild \ 3.2.0 \ Frameworks \ Projekte \ Framework \ src \ mx \ core \ Container.as: 3579] bei MX. core :: Container/createComponentsFromDescriptors() [C: \ autobuild \ 3.2.0 \ Frameworks \ Projekte \ Framework \ src \ mx \ core \ Container.as: 3493] bei mx.core :: Container/createChildren() [C : \ autobuild \ 3.2.0 \ Framework \ Projekte \ Framework \ src \ mx \ core \ Container.as: 2589] bei mx.core :: UIComponent/initialize() [C: \ autobuild \ 3.2.0 \ Frameworks \ projekte \ framework \ src \ mx \ core \ UIComponent.as: 5370] bei mx.core :: Container/initialize() [C: \ autobuild \ 3.2.0 \ Frameworks \ Projekte \ Framework \ src \ mx \ core \ Container.as:2526] unter mx.core :: Application/initialize() [C: \ autobuild \ 3.2.0 \ Frameworks \ Projekte \ Framework \ src \ mx \ core \ Application.as: 846] bei Practi ce/initialize() [C: \ Dokumente und Einstellungen \ LocalService \ Eigene Dateien \ Flex Builder 3 \ Praxis \ src \ Praxis.mxml: 0] bei mx.managers :: SystemManager/http://www.adobe.com/2006/flex/mx/internal::childAdded()[C: \ autobuild \ 3.2.0 \ Frameworks \ Projekte \ Framework \ src \ mx \ Manager \ SystemManager.as: 2009] bei mx.managers :: SystemManager/initializeTopLevelWindow() [C: \ autobuild \ 3.2.0 \ Frameworks \ Projekte \ Framework \ src \ mx \ managers \ SystemManager.as: 3234] unter mx.managers :: SystemManager/http://www.adobe.com/2006/flex/mx/internal::docFrameHandler()[C: \ autobuild \ 3.2.0 \ Frameworks \ Projekte \ Framework \ src \ mx \ Manager \ SystemManager.as: 3064] bei mx.managers: : SystemManager/docFrameListener() [C: \ autobuild \ 3.2.0 \ Frameworks \ Projekte \ Framework \ src \ mx \ manager \ SystemManager.as: 2916]

Hinzufügen von chipCount="0" zu dem MXML l diese ike:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="fnc.*"> 
    <ns1:Deck chipCount="0" horizontalCenter="0" verticalCenter="0"> 
    </ns1:Deck> 
</mx:Application> 

Ruft diesen Compiler-Fehler:

Severity und Beschreibung Pfad Resource Location Erstellungszeit Id Property 'Chipcount' ist schreibgeschützt. Practice/src Practice.mxml Zeile 3 1242656555328 26

Wie lege ich die anfängliche Chipanzahl fest?

Antwort

2

In Antwort auf brd6644 Kommentar:

package 
{ 
    import mx.containers.Canvas; 

    public class Deck extends Canvas 
    { 
     protected var _chipCount:int; 
     private var chipCountChanged:Boolean; 

     public function Deck() 
     { 
      super(); 
     } 

     public function set chipCount(value:int):void 
     { 
      if (chipCount != value) 
      { 
       _chipCount = value; 
       chipCountChanged = true; 
       invalidateProperties(); 
       //call invalidateSize() if changing chipCount value may change the size of your component 
       //call invalidateDisplayList() if changing chipCount value need a redraw of your component 
      } 
     } 

     public function get chipCount():int 
     { 
      return _chipCount; 
     } 

     override protected function commitProperties():void 
     { 
      super.commitProperties(); 

      if (chipCountChanged) 
      { 
       chipCountChanged = false; 
       //here update properties that change because of chipCount new value. 
      } 
     } 

    } 
} 
6

Sie können keine Parameter an den Konstruktor eines Elements übergeben, wenn Sie es in MXML deklarieren. Sie benötigen einen leeren Konstruktor und dann eine Eigenschaft namens ChipCount. Ihr Code muss auch aktualisiert werden, damit ChipCount nicht gesetzt (oder auf 0 gesetzt) ​​wird.

Meine Empfehlung wäre Deck zu etwas zu ändern:

public class Deck extends Canvas { 

    protected var _chipCount:int; 

    public function Deck() { 
     _chipCount = 0; // Default ChipCount and wait for it to be set. 
    } 

    public function get chipCount():int { 
     return _chipCount; 
    } 

    public function set chipCount(value:int):int { 
     // Add logic here to validate ChipCount before setting. 
     _chipCount = value; 

    } 
} 
+0

gah, Sie schlugen mich darauf! – quoo

+0

Sie können einen Schritt weiter gehen, um das UIComponent-Invalidierungsschema zu verwenden. Fügen Sie eine Eigenschaft "chipCountChanged" hinzu, legen Sie sie im Setter für chipCount auf "true" fest und rufen Sie anschließend invalidateProperties() auf. Überschreiben Sie dann commitProperties(), falls chipCountChanged == true, und verarbeiten Sie die Änderung zu diesem Zeitpunkt. So arbeiten die meisten integrierten UIComponents. –

+0

Ich wünschte, ich hätte verstanden, was du meinst - aber ich kann nicht ohne den vollständigen Beispielcode. –

1

Ich glaube, dass, wenn Sie eine UIComponent erstrecken Sie keine Argumente an den Konstruktor übergeben kann - Sie einen anderen Weg finden müssen, würde von Chipanzahl einstellen.Ich würde vorschlagen, für das Initiieren des Ereignisses zu hören, und setzte es dann:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Script> 
    public function setChipCount():void{ 
    myDeck.chipCount = 0; 
    } 
</mx:Script> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="fnc.*"> 
    <ns1:Deck id="myDeck" initalize="setChipCount()" horizontalCenter="0" verticalCenter="0"> 
    </ns1:Deck> 
</mx:Application> 
Verwandte Themen