2009-02-17 3 views
3

Consultez ce code:Pourquoi ne puis-je pas accéder à une zone de liste déroulante dans une méthode de rappel dans Flash CS4?

import mx.core.View; 
var accordianPane = my_acc.createSegment("mcElectrical", "panel0", "Electrical", "payIcon"); 
accordianPane.comboBox.addItem("test"); 

Cela ajoute un élément avec l'étiquette « test » à une zone de liste déroulante dans un clip vidéo. Cela fonctionne parfaitement bien. Toutefois, lorsque je mets le même code dans une fonction de rappel, il échoue.

import mx.core.View; 

// Load Cost Guide feed. 
var costGuideUrl:String = "http://test/cost-guide.ashx"; 
var costGuideXml:XML = new XML(); 
costGuideXml.onLoad = function(success) { 
    if(success) { 
     populateAccordian(this); 
    } else { 
     // Display error message. 
    } 
}; 
costGuideXml.load(costGuideUrl); 

// Populate Accordian with retrieved XML. 
function populateAccordian(costGuideXml:XML) { 

    var accordianPane = my_acc.createSegment("mcElectrical", "panel0", "Electrical", "payIcon"); 
    accordianPane.comboBox.addItem("test"); 
    // This line definitely executes... 
} 

Des idées sur les raisons pour lesquelles je ne peux pas accéder à la liste déroulante depuis l'intérieur du rappel?

Répondre

2

Ok, alors d'abord, il semble que vous utilisez AS2.

Comme il est as2, le problème est probablement un problème de portée. La portée fonctionne différemment dans as2 à as3. En repensant à mes as2 jours, lorsque vous définissez cette fonction de rappel, vous êtes alors dans le cadre de costGuideXML. Comme vous êtes dans cette portée, vous n'avez pas accès à la variable my_acc. Ce que vous avez probablement besoin d'utiliser est la classe Delegate pour que la méthode populateAccordian s'exécute dans la portée de la classe d'origine (il y a de fortes chances qu'un movieclip se trouve sur un scénario).

Quelque chose comme (bien que ce soit non testé):

import mx.utils.Delegate; 

    // Load Cost Guide feed. 
    var costGuideUrl:String = "http://test/cost-guide.ashx"; 
    var costGuideXml:XML = new XML(); 
    costGuideXml.onLoad = Delegate.create(this, xmlLoadedHandler); 
    costGuideXml.load(costGuideUrl); 

    function xmlLoadedHandler() : Void 
    { 
    populateAccordian(costGuideXml); 
    } 

    // Populate Accordian with retrieved XML. 
    function populateAccordian(costGuideXml:XML) { 

     var accordianPane = my_acc.createSegment("mcElectrical", "panel0", "Electrical", "payIcon"); 
     accordianPane.comboBox.addItem("test"); 
     // This line definitely executes... 
    } 
Questions connexes