2010-06-09 18 views
0

Un objet Flash (en fait Flex) est créé sur une page ASP.Net dans un panneau de mise à jour en utilisant une version modifiée du script embedCallAC_FL_RunContent.js afin qu'il puisse être écrit dynamiquement. Il est recréé avec ce script avec chaque publication partielle de ce panneau. Il existe également d'autres panneaux de mise à jour sur la page.La file d'attente ExternalInterface appelle l'objet Flash dans UpdatePanel - Nécessite une amélioration?

Avec certaines publications (partielles et complètes), des appels d'interface externe tels que $get('FlashObj').ExternalInterfaceFunc('arg1', 0, true); sont préparés côté serveur et ajoutés à la page à l'aide de ScriptManager.RegisterStartupScript. Ils sont intégrés dans une fonction et insérés dans l'événement load de Sys.Application, par exemple Sys.Application.add_load(funcContainingExternalInterfaceCalls). Le problème est que parce que l'état de l'objet Flash peut changer avec chaque publication partielle, l'objet Flash (Flex) et/ou l'interface externe peuvent ne pas être prêts ou même exister dans le DOM lorsque le JavaScript -> Flash Externe L'appel d'interface est fait. Il en résulte un "objet ne prend pas en charge cette propriété ou méthode" exception.

J'ai une stratégie de travail pour faire les appels ExternalInterface immédiatement si Flash est prêt ou les mettre en file d'attente jusqu'à ce que Flash annonce sa disponibilité.

//Called when the Flash object is initialized and can accept ExternalInterfaceCalls 
var flashReady = false; 
//Called by Flash when object is fully initialized 
function setFlashReady() { 
    flashReady = true; 
    //Make any queued ExternalInterface calls, then dequeue 
    while (extIntQueue.length > 0) 
     (extIntQueue.shift())(); 
} 
var extIntQueue = []; 
function callExternalInterface(flashObjName, funcName, args) { 
    //reference to the wrapped ExternalInterface Call 
    var wrapped = extWrap(flashObjName, funcName, args); 
    //only procede with ExternalInterface call if the global flashReady variable has been set 
    if (flashReady) { 
     wrapped(); 
    } 
    else { 
     //queue the function so when flashReady() is called next, the function is called and the aruments are passed. 
     extIntQueue.push(wrapped); 
    } 
} 
//bundle ExtInt call and hold variables in a closure 
function extWrap(flashObjName, funcName, args) { 
     //put vars in closure 
     return function() { 
      var funcCall = '$get("' + flashObjName + '").' + funcName; 
      eval(funcCall).apply(this, args); 
     } 
    } 

Je règle le flashReady var à encrasser chaque fois que je mets à jour le panneau de mise à jour qui contient l'objet Flash (Flex). Je suis heureux que je l'ai eu pour fonctionner, mais il se sent comme un hack. Je suis toujours sur la courbe d'apprentissage en ce qui concerne les concepts comme les fermetures pourquoi "eval()" est apparemment mauvais, donc je me demande si je viole une meilleure pratique ou si ce code devrait être amélioré, si oui comment? Merci.

Répondre

0

Malheureusement, j'ai dû faire des solutions de contournement très similaires à ce que vous faites, à la fois en vérifiant que Flash est prêt à accepter les appels, puis en mettant en file d'attente les commandes.

L'appel de plusieurs appels ExternalInterface en succession rapide (à moins de 400 millisecondes d'intervalle) peut entraîner l'ignorance ou la suppression de certains appels.

Je ressens votre douleur!