Frage

Dies ist ein Follow-up-Frage von dieses , ich will nicht in den Kommentaren gehen zu halten und die Menschen von immer hart verdienten Ruf zu verhindern ...:)

In meiner Cairngorm Befehlsklasse, um es mich zu kompilieren benötigen ihm zu sagen, was myCanvas war, so dass ich diese Zeile verwendet:

var myCanvas : MyCanvas = new MyCanvas;

Ich vermute, das ist falsch, obwohl, denn obwohl es kompiliert, wenn ich versuche, so etwas zu tun:

if (myCanvas.subObject.value == 0) { ... }

es wird diesen Fehler werfen:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at com.foo.bar.command::MyCommand/execute()

als ob der SUBOBJECT existiert nicht. Es sieht aus wie ich könnte eine neue Instanz von MyCanvas bekommen, nicht die Instanz ich aus dem main.mxml mit der ID myCanvas will. Habe ich recht? Wie kann ich dieses Problem beheben?

Edit (10.59 GMT + 1): Okay, so sieht es aus wie ich Art und Weise auch hier war vage. Hier ist mein main.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:control="com.foo.bar.control.*" 
    xmlns:business="com.foo.bar.business.*"
    xmlns:view="com.foo.bar.view.*"
    applicationComplete="com.foo.bar.util.StartupUtil.init()"
    horizontalScrollPolicy="off"
    verticalScrollPolicy="off"
    borderThickness="0"
    paddingBottom="0"
    paddingLeft="0"
    paddingTop="0"
    paddingRight="0"
>
    <mx:Script>
        <![CDATA[
            import com.foo.bar.model.PlayerModelLocator;

            [Bindable]
            private var model : PlayerModelLocator = PlayerModelLocator.getInstance();
        ]]>
    </mx:Script>

    <!-- ========================================================================== -->

        <!-- the ServiceLocator where we specify the remote services -->
        <business:Services id="services" />

        <!-- the FrontController, containing Commands specific to this application -->
        <control:PlayerController id="controller" />

    <!-- ========================================================================== -->

  <mx:Style source="assets/main.css" />
  <view:MyCanvas id="myCanvas" /> 

</mx:Application>

Und hier ist mein com/foo/bar/command/MyCommand.as:

package com.foo.bar.command {
    /* add to controller
    addCommand( MyEvent.EVENT_CHANGE_VOLUME, ChangeVolumeCommand );
    */
    import flash.net.SharedObject;
    import com.adobe.cairngorm.control.CairngormEvent;
    import com.adobe.cairngorm.commands.ICommand;

    import com.foo.bar.model.PlayerModelLocator;
    import com.foo.bar.event.MyEvent;
    import com.foo.bar.view.*;

    public class ChangeVolumeCommand implements ICommand {
        public function execute(event:CairngormEvent):void {
      var model : PlayerModelLocator = PlayerModelLocator.getInstance();
      var myEvent : MyEvent = MyEvent(event);
      var myCanvas : MyCanvas = new MyCanvas();
      var so:SharedObject = SharedObject.getLocal("fixie.video");
      if (myCanvas.subObject.value == 0) {
        trace("subobject value is 0");
      }
        }
    }
}

Grundsätzlich möchte ich einen Griff auf das Objekt mit ID myCanvas in main.mxml erhalten mit dem myCanvas Objekt in MyCommand.as

War es hilfreich?

Lösung

Was ist der Umfang Ihrer myCanvas Variable? Ist es innerhalb einer Methode irgendwo? Sie müssen es öffentlich machen oder geben Sie es Getter / Setter der Lage sein, darauf zuzugreifen.

Sie können auch diese zu referenzieren versuchen, bevor er zu seinem übergeordneten hinzugefügt wurde, mit der addChild () -Methode.

Es gibt wirklich nicht genug Code in Ihre Beispiele, das Problem zu bestimmen, aber diese Dinge sollten Sie irgendwo geben zu Beginn der Suche.

Andere Tipps

Könnte ein paar Dinge sein. Zuerst müssen Sie Klammern auf dem Klassennamen nach der „neuen“ Erklärung: new MyCanvas(); Zweitens können Sie Ihre Unter Komponente zuzugreifen versuchen, bevor die Komponente Lebenszyklus bereit ist, für Sie zu tun. (Es ist schwer, aus dem Code zu sagen, Sie auf dem Laufenden, da es nicht genügend Kontext ist.)

1 Art und Weise ist eventlistener hinzuzufügen, wenn Ihr myCanvas nach creationComplete- fertig sein wird und alle Ihre Sachen zu tun

und das zweite ist: definieren Sie Ihre SUBOBJECT , wie in myCanvas Klasse, so dass Sie es auf Init Stufe Ihrer Komponente Zugang der Lage sein werden.

Grüße Eugene

P. S. die ganze Zeit alle wollen, ohne gut gebildete Probe ihres Problems Antwort zu bekommen, seine schrecklich !!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top