سؤال

أنا جديد قليلا على Actioncript، لكنني لا أستطيع معرفة هذا واحد. لقد فعلت الكثير من البحث في هذا الموضوع ولم أجد إجابة واضحة. لقد جربت الحلول التالية التي نشرها الأشخاص عبر الإنترنت ولكن لا أحد منهم يعملون.

كل ما يلي حلول إعطاء الخطأ: 1120: الوصول إلى الممتلكات غير المحددة myvariable

اقتراح رقم 1:

try {
     trace(myVariable); }
catch {
     trace("your variable doesn't exist"); }

اقتراح # 2:

if (myVariable) {
     trace("your variable exists!!"); }
else {
     trace("it doesn't exist"); }

اقتراح رقم 3:

if ( myVariable == null )
     trace("your variable doesn't exist");

اقتراح # 4:

if ( myVariable == undefined )
     trace("your variable doesn't exist");

كما قلت، لقد وجدت العديد من مشاركات المنتديات والأشياء عبر الإنترنت التي تعطي الاقتراحات المذكورة أعلاه قائلة أنها ستعمل، ولكن يبدو أنهم جميعا يعطونني ذلك 1120: الوصول إلى الممتلكات غير المحددة myvariable خطأ.

بالمناسبة، في حال كنت تتساءل لماذا سأحتاج إلى التحقق مما إذا كان متغير موجود أم لا، فأنا أخطط لإصدار المتغيرات إلى SWF في عنوان URL الخاص به، لذلك أحتاج إلى التأكد من وجود المتغيرات المناسبة والتعامل مع الكود بشكل صحيح إذا لم يتم تمريرها.


شكرا على الرد السريع. لا يزال لا يعمل حقا. نطاق المتغير هو فقط على مستوى أعلى / الجذر من البرنامج النصي. أساسا، أبدأ ملف فلاش جديد، في الإطار الأول، أضيف الإجراء التالي:

// to check for this.myVariable
if ( this.hasOwnProperty( "myVariable" ) ) {
     trace("myVariable exists");
}
else
{
     //Variable doesn't exist, so declare it now
     trace("declaring variable now...");
     var myVariable = "Default Value";
}

trace(myVariable);

عندما أقوم بتشغيل ملف الفلاش، أحصل على هذا الإخراج:

myVariable exists
undefined

كنت أتوقع هذا:

declaring variable now...
Default Value
هل كانت مفيدة؟

المحلول

بالمناسبة، في حال كنت تتساءل لماذا سأحتاج إلى التحقق مما إذا كان متغير موجود أم لا، فأنا أخطط لإصدار المتغيرات إلى SWF في عنوان URL الخاص به، لذلك أحتاج إلى التأكد من وجود المتغيرات المناسبة والتعامل مع الكود بشكل صحيح إذا لم يتم تمريرها.

ثم تأخذ النهج الخاطئ. إليك الطريق الصحيح ™ لقراءة ومعلمات SWF وصلاحية، إلى جانب القيمة الافتراضية إذا لم تكن موجودة:

private function parameter(name:String, defaultValue:String):String
{
        // Get parameter list
    var paramObj:Object = LoaderInfo(stage.loaderInfo).parameters;

        // Check if parameter exists
    if(paramObj.hasOwnProperty(name) && paramObj[name] != "")
        return paramObj[name];                     
    else
        return defaultValue;
}

تحذير! نظرا لأن هذه المرحلات على ملكية "المرحلة"، استخدم هذا الرمز إما من فئة المستند أو بعد Event.ADDED_TO_STAGE.

نصائح أخرى

إجابة ليرانونا هي بالتأكيد الصحيح طريقة للوصول إلى معلمات التحميل. ومع ذلك، للإجابة على مسألة كيفية التحقق من وجود المتغيرات (للأجمل)، يتم ذلك مع hasownproperty () الطريقة، التي موجودة على جميع الكائنات:

// to check for this.myVariable
if ( this.hasOwnProperty( "myVariable" ) ) {
    trace("myVariable exists");
} else {
    //Variable doesn't exist, so declare it now
    trace("declaring variable now...");
    this.myVariable = "Default Value";
}

trace( this.myVariable );

يجب أن تغطي وضعك. لكنني لا أعرف بأي طريقة للتحقق من وجود متغير بالطريقة التي تحاول القيام بها، بمجرد إجراء مرجع مباشرة إلى المتغير. أعتقد أنه يجب عليك الرجوع إليها من خلال نطاقها.

من المحتمل أن يكون الأحصم الأكثر أهمية. (ربما يجب علي تعديل بعض التعليمات البرمجية الخاصة بي لاستخدام هذه الطريقة). لكن الطريقة التي تستخدمها حاليا للفصول الدراسية هي:

try {
  if(this["myFunction") {
    this["myFunction"]();
  }
catch(e:Error) {}

وهو ليس الأكثر أناقة لأنه يلقي الاستثناءات.

السبب الخاص بي لاستخدام هذا النوع من التعليمات البرمجية هو أننا نفعل القليل من الترميز الديناميكي والاستثناء "يتضمن" في المرنة لكتابة رمز الغزل.

تتبع (myvariable)؛

عندما تكون المرحلة غير متوفرة، قد تحاول استخراج المعلمات من Root.LoaderInfo.Parameters. احرص على التحقق مما إذا كانت كل خاصية السلسلة فارغة.

if( root != null && root.loaderInfo != null && root.loaderInfo.parameters != null ) {
     myVar = root.loaderInfo.parameters.myVar;
}
    if (myVariable === "undefined") {
      trace("variable doesn't exist");
    else
      trace("variable exists");

لاحظ مشغل المقارنة الثلاثي. إنها خدعة صغيرة تعلمتها من أيام JavaScript الخاصة بي. يعمل أيضا في AS3 وهو مفيد للتحقق من وجود عنصر الصفيف حتى لو كان NULL. مثله:

var array:Array = ["zero", 1, null];
if (array[2]) //returns false
if (array[2] !==  "undefined") //returns true

لقد تلقيت نفس المشكلة مؤخرا، وأنتظرت عن طرق لإصلاح هذا. ومع ذلك، فقد وجدت أنه عند تسجيل المتغير مثل ...

var i:int;

... أنه لا إعادة تعيين المتغير إذا تم بالفعل إجراء. على سبيل المثال، إذا كان هذا هو رمز الإطار الخاص بي 1:

var i:int;
if (i > 0){
    i++;
} else {
    i = 1;
}

ثم ستكون هذه هي قيم "أنا" في كل مرة يعرض الفلاش عبر نفس الإطار:

// First Iteration
trace(i); // 1
// Second Iteration
trace(i); // 2
// Third
trace(i); // 3, etc...

عملت في مشروعي الخاص، وهو أقل رمز أقل من الإجابة السابقة. آمل أن يعمل لك أيضا.

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