Patch SWFAddress pour AS3/FlashCS3
Par Magu(s) le mardi 24 juillet 2007, 12h08 - Geek - Lien permanent - URL miniature
Je viens de me lancer gentillement dans mon premier projet Actionscript 3 avec le nouveau Flash CS3. Il s'agit d'une intégration d'un MVC maison en AS dans le Zend Framework de PHP pour le nouveau site de ma boite ( j'en reparlerai plus tard normalement ). Et donc pour assurer la correspondance entre les réécritures d'url du ZF et de Flash j'utilise les fantastiques classes SWFAddress.
Seulement, dû à un étrange comportement du compilateur de Flash CS3 ( apparement ça le fait pas dans Flex ), il n'est pas possible de faire appel aux méthodes statiques d'une classe AS3 depuis l'init de la classe. Je m'explique...
Pour une raison quelconque, SWFAddress utilise un setInterval dès son initialisation pour lancer un premier appel javascript dès que le swf est chargé au runtime. En actionscript 2, cela fonctionne très bien et se présente comme ceci :
class SWFAddress {
...
private static var _interval:Number;
private static var _init = SWFAddress._initialize();
public static var onChange:Function;
private static function _check():Void {
if (SWFAddress.onChange) {
clearInterval(SWFAddress._interval);
SWFAddress.setValue(SWFAddress.getValue());
}
}
private static function _initialize():Void {
SWFAddress._interval = setInterval(SWFAddress._check, 10);
if (_availability) {
ExternalInterface.addCallback('getSWFAddressValue', SWFAddress,
function():String {return this._value});
ExternalInterface.addCallback('setSWFAddressValue', SWFAddress,
SWFAddress.setValue);
}
}
...
}
Grâce à ligne private static var _init = SWFAddress._initialize(); le compilateur prépare la classe pour qu'elle lance la méthode _initialize dès qu'elle est chargée au runtime. Malheureusement ce genre de combine ne semble plus fonctionner avec le nouveau compilo. Dans la version AS3 de SWFAddress on trouve pourtant ceci :
package {
import flash.external.ExternalInterface;
import flash.utils.clearInterval;
import flash.utils.setInterval;
public class SWFAddress {
...
public static var onChange:Function;
private static function _check():void {
if (SWFAddress.onChange != null) {
clearInterval(SWFAddress._interval);
if (_availability) {
ExternalInterface.addCallback('getSWFAddressValue',
function():String {return _value});
ExternalInterface.addCallback('setSWFAddressValue',
SWFAddress.setValue);
}
SWFAddress.setValue(SWFAddress.getValue());
}
}
private static var _interval:Number = setInterval(SWFAddress._check, 10);
...
}
}
Je suppose qu'en Flex on peut utiliser cette technique avec un setInterval puisque c'est une fonction native mais dans Flash CS3 ça ne marche simplement pas. Une autre bizzarerie que je n'ai pas pu comprendre, c'est pourquoi les registrations des callbacks js ont été déplacé dans le test de chargement de la classe ? Parce que finalement ça ne fontionne pas non plus et ça crée un 2eme problème dans Flash.
J'ai finalement opté pour une méthode publique init à lancer soit même. Ce n'est pas le plus propre qu'il soit, mais en attendant une correction de SWFAddress pour Flash CS3 ça fait son travail :
package {
import flash.external.ExternalInterface;
import flash.utils.clearInterval;
import flash.utils.setInterval;
public class SWFAddress {
...
private static var _interval:Number;
public static var onChange:Function;
private static function _check():void {
if (SWFAddress.onChange != null) {
clearInterval(SWFAddress._interval);
SWFAddress.setValue(SWFAddress.getValue());
}
}
public static function init():void{
_interval = setInterval(SWFAddress._check, 10);
if (_availability) {
ExternalInterface.addCallback('getSWFAddressValue',
function():String {return _value});
ExternalInterface.addCallback('setSWFAddressValue',
SWFAddress.setValue);
}
...
}
}
Il faut donc lancer SWFAddress.init(); à la main au début de son projet pour que celà fonctionne.
Vous pouvez télécharger la version modifiée de la classe AS3 ici
En tous cas SWFAddress est un fabuleux outil et ce petit bug sera sans doute rapidement corrigé par les auteurs, affaire à suivre donc...
Commentaires
Je profite en passant pour rappeler qu'il faudrait activer la colorisation syntaxique de geshi
voilà un billet qui fait du bien.
J'viens d'essayer la version 2.0 de SWFAddress et apparement ce bug n'existe plus, ça c'est cool
ouf, ça me rassure.
Hey Le Magu(s) !
Qd tu as intrégré SWFAdress avec Zend tu utilisais le dispatcher ?
J'entends pas là, qd tu appelles /controller/action avec SWFAddress est-ce que tu retombes bien dans l'action de ton controller, ou SWFAddress s'adresse directement à "/controller/action/index.html" ?
J'ai du mal à exprimer la question que je me pose.... mais j'imagine que tu vois ce que je veux dire.
syog http://feed.informer.com/forums/pro... world war 2 mhla
epjg http://snurl.com/21zx5mt vipit huxl
udjw http://hastaneyonetim.com/fkero vippi 100 vgzk