لماذا يكون مرجع كائني فارغًا عند محاولة الرجوع إلى MX: Canvas من ActionScript؟

StackOverflow https://stackoverflow.com/questions/3612553

سؤال

هذا سؤال متابعة من هذا, ، لا أريد أن أستمر في التعليقات ومنع الناس من الحصول على سمعة راكدة ... :)

في فئة أوامر Cairngorm الخاصة بي ، للحصول على ترجمة ، كنت بحاجة إلى إخبارها بماهية Mycanvas ، لذلك استخدمت هذا الخط:

var myCanvas : MyCanvas = new MyCanvas;

أظن أن هذا خطأ ، لأنه على الرغم من أنه يجمع ، إذا حاولت فعل شيء مثل هذا:

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

سوف يرمي هذا الخطأ:

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

كما لو أن SubObject غير موجود. يبدو أنني قد أحصل على مثيل جديد من mycanvas ، وليس المثال الذي أريده من main.mxml مع معرف mycanvas. هل انا على حق؟ كيف يمكنني حل هذه المشكلة؟

تحرير (10:59 مساءً بتوقيت جرينتش+1): حسنًا ، لذلك يبدو أنني كنت غامضة للغاية هنا. ها أنا 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>

وهنا أنا 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");
      }
        }
    }
}

في الأساس ، أريد الحصول على مقبض على الكائن مع معرف myCanvas في main.mxml باستخدام myCanvas الاعتراض في MyCommand.as

هل كانت مفيدة؟

المحلول

ما هو نطاق متغير mycanvas الخاص بك؟ هل هو داخل طريقة في مكان ما؟ ستحتاج إلى جعلها علنية أو إعطائها getter/setter لتتمكن من الوصول إليها.

قد تحاول أيضًا الرجوع إليها قبل إضافتها إلى الوالد ، باستخدام طريقة AddChild ().

لا يوجد حقًا رمز كافي في الأمثلة الخاصة بك لتحديد المشكلة ، ولكن هذه الأشياء يجب أن تمنحك مكانًا لبدء البحث.

نصائح أخرى

يمكن أن يكون بضعة أشياء. أولاً ، تحتاج إلى أقواس على اسم الفصل الخاص بك بعد البيان "الجديد": new MyCanvas(); ثانياً ، قد تحاول الوصول إلى المكون الفرعي قبل أن تكون دورة حياة المكون جاهزة لك للقيام بذلك. (من الصعب معرفة الكود الذي نشرته لأنه لا يوجد سياق كافٍ.)

طريقة واحدة هي إضافة eventListener عندما تكون MyCanvas جاهزة بعد CreateComplete والقيام بكل ما تبذلونه من الأشياء

والثاني هو: تحديد الخاص بك SubObject كما هو الحال في فئة Mycanvas ، ستتمكن من الوصول إليه على مرحلة init من المكون.

تحياتي يوجين

ملاحظة: كل الوقت يريد الجميع الحصول على إجابة دون عينة من مشكلتهم جيدًا ، فهي فظيعة !!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top