AS3 - هل يمكنني الكشف عن تغيير قيمة المتغير باستخدام addEventListener؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

هل من الممكن استخدام EventListener للاستماع إلى متغير وكشف عند قيمة تلك التغييرات متغير؟ شكرا.

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

المحلول

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

و(ملاحظة: المحددات وحاصل على يعاملون مثل خصائص). كنت مجرد تعيين قيمة، بدلا من استدعاء أسلوب (على سبيل المثال someVar = 5 بدلا من someVar(5); على الرغم من واضعي / وظائف / الأساليب، يتم التعامل مع حاصل على أنها مثل خصائص.

//The document class
package
{
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.EventDispatcher;

  public Class TestDocClass extends Sprite
  {
    private var _model:Model;

    public function TestDocClass():void
    {
      _model = new Model();
      _model.addEventListener(Model.VALUE_CHANGED, onModelChanged);
    }

    private function onModelChanged(e:Event):void
    {
      trace('The value changed');
    }
  }
}

//The model that holds the data (variables, etc) and dispatches events. Save in same folder as DOC Class;
package
{
  import flash.events.Event;
  import flash.events.EventDispatcher;

  public class Model extends EventDispatcher
  {
    public static const VALUE_CHANGED:String = 'value_changed';
    private var _someVar:someVarType;

    public function Model():void
    {
      trace('The model was instantiated.');
    }

    public function set someVariable(newVal:someVarType):void
    {
      _someVar = newVal;
      this.dispatchEvent(new Event(Model.VALUE_CHANGED));
    }
  }
}

نصائح أخرى

وBrianHodge: كيف كنت في الواقع استخدام المثال الخاص بك؟ كيف يمكنك استدعاء الدالة مجموعة؟ كيف يمكنك الرجوع إليه؟ أين تمرير المتغير إلى تغيير ..؟

ودعونا نقول إذا أريد تغيير المتغير ملفوفة بنقرة زر، على سبيل المثال. لا بد لي من أن أعترف بأنني حاولت بعض الدول الاخرى رموز والمثال (جالبة / اضع) نوع، مع dispatchEvent أو بدون، وأنا لا يمكن الحصول على أكثر من ذلك! لكن المثال الخاص بك ويبدو أن بالضبط ما أحتاج، لا يمكن أن تجعل من العمل.

وأحصل على The model was instantiated عندما ضبط وظيفة من الطبقة ثيقة. هذا كل شيء.

وتبين لي، في الماضي، لأشخاص مثلي الذين تضييع الوقت مع هذا الشيء إيفاد!
في حالتي لابد من البيانات المطبوعة على أنها _someVar (نفس الشيء بالنسبة لString) المتغير fornewVal.

وتعيين OnceTestDocClass من الطبقة المستند. يمكنك الرجوع إلى نموذج مثيل مثل هذا:

_model.someVariable="new stuff";  

وكنت أحاول أن تغيير قيمة مثل هذا:

_model.someVariable("new stuff");  

ويمكنك إضافة بعض الإجراءات أثر في فئة Model أن يكون العرض واضحا في لوحة الإخراج:

package
{
  import flash.events.Event;
  import flash.events.EventDispatcher;

  public class Model extends EventDispatcher
  {
    public static const VALUE_CHANGED:String = 'value_changed';
    private var _someVar:String = "default";

    public function Model():void
    {
      trace('The model was instantiated.');
    }

    public function set someVariable(newVal:String):void
    {
      trace ("before " + _someVar);
      _someVar = newVal;
      trace ("after " + _someVar);
      this.dispatchEvent(new Event(Model.VALUE_CHANGED));
    }
  }
}

وانها ليست من ذلك بكثير، ولكن هذه الأمور يمكن أن يكلف بعض الناس الكثير من الوقت كله =)

ويمكنك استخدامها لتكون قادرة على القيام بشيء مماثل في AS2 باستخدام Object.watch. أنا لا أرى ما يعادل المباشر، ولكن يبدو أن <لأ href = "http://livedocs.adobe.com/flex/3/langref/mx/binding/utils/ChangeWatcher.html" يختلط = "نوفولو noreferrer" > mx.binding.utils.ChangeWatcher سوف أعطيك ظائف مماثلة لأية متغيرات التي يمكن ربطها.

وأنا لا أعرف من وسيلة للقيام بذلك في AS3 للمتغيرات غير التي يمكن ربطها، ولكن إذا كان المتغير الذي تريد مشاهدته هو يمكن ربطها (أو إذا كنت يمكن تعديله ليكون binadable) ثم ChangeWatcher قد تعطيك ما تريد.

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