سؤال

أحاول إرفاق وظيفة مع معلمات إلى المؤقت ولكنها تقول "وظيفة النوع غير المرتبطة" هل هناك أي طريقة للتغلب على هذا ؟؟

مثال رمز:

var redoTimer:Timer = new Timer(50);

redoTimer.addEventListener(TimerEvent.TIMER, saySomething("helloo"));
redoTimer.start();

لن يبدو أن هذا يعمل ولكن هل هناك طريقة لتمرير الحجج ؟؟؟

شكرا ماثي

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

المحلول

لا يمكنك فعل ذلك حقًا ، فإن أقرب ما يعادله هو استخدام وظيفة مضمنة صغيرة لالتفاف وظيفتك الخاصة:

var redoTimer:Timer = new Timer(50);

redoTimer.addEventListener(TimerEvent.TIMER, function(e:Event):void { saySomething("helloo") } );
redoTimer.start();

نصائح أخرى

ال المعلمة الثانية إلى addEventListener يجب أن تكون الوظيفة وظيفة. الكود الخاص بك ينفذ بالفعل الطريقة saySomething("helloo") ويحاول استخدام قيمة الإرجاع الخاصة به كمعلمة ثانية إلى addEventListener وبالتالي الخطأ.

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

هذا ممكن مع نهج الدوار. لمعالج الحدث ، استخدم أ الوظيفة التي تُرجع وظيفة مجهولة متداخلة.

private var textFieldA:TextField = new TextField;
private var textFieldB:TextField = new TextField;

public function setParameterizedTextWhenTextFieldsAreClicked ():void {
    addChild(textFieldA);
    textFieldA.text = 'Text field A';
    textFieldA.addEventListener(MouseEvent.CLICK, showCustomMessage("One"));

    addChild(textFieldB);
    textFieldB.text = 'Text field B';
    textFieldB.y = 20;
    textFieldB.addEventListener(MouseEvent.CLICK, showCustomMessage("Two"));
    // NOTE: We must use strongly referenced listeners because weakly referenced 
    // listeners **will get garbage collected** because we're returning
    // an anonymous function, which gets defined in the global namespace and  
    // thus, the garbage collector does not have anything pointing to it.
}

private function showCustomMessage (message:String):Function {
    // NOTE: You can store the following function to a class variable
    // to keep it in memory, which would let you use weakly referenced 
    // listeners when using this as an event handler. Many people 
    // would find that awkward. I would discourage that.
    return function (e:MouseEvent):void {
        var textField:TextField = e.target as TextField;
        textField.text = message; // "message" argument is available because 
                                  // this function's scope is kept in memory.
    }
}

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

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

stage.addEventListener(MouseEvent.CLICK, onClick(true, 123, 4.56, "string"));
function onClick(b:Boolean, i:int, n:Number, s:String):Function {
  return function(e:MouseEvent):void {
    trace("Received " + b + ", " + i + ", " + n + " and " + s + ".");
  };
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top