2015-09-15 1 views
2

Как вы получаете обратные вызовы, запущенные в haxe 3, которые передаются другим классом?обратные вызовы, переданные из другого класса

Я пытаюсь передать функцию обратного вызова класса, но я получаю сообщение об ошибке

public static var onFocusCallback:Dynamic; 

public static function triggerFocus():Void 
{ 
    onFocusCallback.bind(); 
} 

ошибка я получаю [Fault] exception, information=ReferenceError: Error #1069: Property bind not found on builtin.as$0.MethodClosure and there is no default value.

ответ

6

Старайтесь не использовать Dynamic, если это возможно. Это может вызвать такие странные ошибки, как эта.

Способ использования обратного вызова, как это http://try.haxe.org/#60f45

class Test { 
    static function main() { 
     onFocusCallback = function() { 
      trace("focus"); 
     } 
     triggerFocus(); 
    } 

    // Try not to use Dynamic 
    //public static var onFocusCallback:Dynamic; 
    // If you don't know the type of the function, you can use this: 
    //public static var onFocusCallback:haxe.Constraints.Function; 
    // But it's always better to give a concrete type like: 
    public static var onFocusCallback:Void->Void; 


    public static function triggerFocus():Void 
    { 
     if(onFocusCallback != null) onFocusCallback(); 
    } 
} 
+1

Aha, я стараюсь что изначально моя проблема заключалась в определении переменной. Я использовал 'public static var onFocusCallback: Function;' – Daniel

+0

@ Daniel, вы также можете определить реализацию по умолчанию с помощью модификатора доступа ['dynamic'] (http://haxe.org/manual/class-field-dynamic.html) : 'public static dynamic function onFocusCallback() {throw« Не реализовано, переназначить сначала »; } '([example] (http://try.haxe.org/#A9459)) –

-1

другого решения я получил работу, в течение нескольких минут размещения вопрос, должен был использовать Reflect

Reflect.callMethod(null, onFocusCallback, []); 
+2

Хотя это также может сработать, я также рекомендовал бы не использовать отражение так много, потому что уничтожение мертвого кода (DCE) не может свободно выполнять свою работу. Иногда, если вы используете DCE full, вам нужно вручную пометить классы/поля с помощью '@: keep', чтобы они не были устранены. Использование 'Void-> Void' вместо Dynamic в вашем случае должно решить проблему. –

+0

Нет необходимости использовать 'Reflect'. Вы можете просто * попробовать * вызвать динамически типизированную переменную: 'onFocusCallback();' ([example] (http://try.haxe.org/#630bd)). Тем не менее, это даст ошибки времени выполнения, которые вы должны обработать, если 'onFocusCallback' не является _yet_ функцией (если это null или что-то еще, что нельзя назвать) ... Типичное решение Justo Delgado лучше. –