Почему я не могу получить доступ к комбинированному списку в методе обратного вызова во Flash CS4? - PullRequest
3 голосов
/ 17 февраля 2009

Проверьте этот код:

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

Добавляет элемент с надписью «test» в поле со списком в мувиклипе. Работает отлично. Однако, когда я помещаю тот же код в функцию обратного вызова, он завершается неудачей.

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...
}

Есть идеи, почему я не могу попасть в комбинированный список из-за обратного вызова?

1 Ответ

2 голосов
/ 18 февраля 2009

Хорошо, так что, во-первых, похоже, что вы используете AS2.

Поскольку это as2, проблема, вероятно, в ограниченном объеме. Scoping работает по-разному в as2 к as3. Возвращаясь к моим дням as2, когда вы устанавливаете эту функцию обратного вызова, вы попадаете в сферу действия costGuideXML. Поскольку вы находитесь в этой области, у вас нет доступа к переменной my_acc.

Вам, вероятно, понадобится использовать класс Delegate, чтобы метод populateAccordian выполнялся в области действия исходного класса (скорее всего, это мувиклип, если он на временной шкале).

Что-то вроде (хотя это не проверено):

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...
    }
...