2009-05-16 2 views
1

Я разработчик C#, который пытается изучить некоторые AS3, так что это будет довольно новый вопрос.Пользовательский класс AS3 имеет значение null после добавления в Array

Я смущаюсь в отношении области видимости и GC, так как у меня есть собственный класс, расширяющий ClassClip (слайд), который я создаю экземпляры внутри цикла и push() в массив, но потом элементы имеют нулевое значение когда я вытаскиваю их из коллекции.

var ldr:URLLoader = new URLLoader(); 
ldr.load(new URLRequest("presentation.xml")); 
ldr.addEventListener(
    Event.COMPLETE, 
    function(e:Event):void { 
     config = new XML(e.target.data); 
     for (var i:Number = 0; i < config.slides.slide.length(); i++) 
     { 
      var node = config.slides.slide[i]; 
      var slide:Slide = new Slide();      
      slides.push(slide); 

      addChild(slide); // Works fine 
     } 
    } 
); 

slides.forEach(function(e:*, index:int, array:Array):void 
    { 
     addChild(e); // Causes "Parameter child must be non-null" exception 
    } 
); 

Я хотел бы иметь возможность ссылки на слайды позже, чтобы переключать их по мере необходимости - как я могу сохранить ссылку на мои новые объекты?

Обновление: Похоже, что с этим возникли две проблемы. Запрос forEach делался до того, как было вызвано полное событие URLLoader, а также forEach, похоже, не работает должным образом. Вот окончательный рабочий код:

var ldr:URLLoader = new URLLoader(); 
ldr.load(new URLRequest("presentation.xml")); 
ldr.addEventListener(
    Event.COMPLETE, 
    function(e:Event):void { 
     config = new XML(e.target.data); 
     for (var i:Number = 0; i < config.slides.slide.length(); i++) 
     { 
      var node = config.slides.slide[i]; 
      var slide:Slide = new Slide();      
      slides.push(slide); 
     } 
     for each (var sl in slides) 
     { 
      addChild(sl); 
     } 
    } 
); 

ответ

1

Попробуйте это. Посмотрим, прослеживает ли он ваши слайды.

var ldr:URLLoader = new URLLoader(); 
ldr.addEventListener(Event.COMPLETE, processXML); 
ldr.load(new URLRequest("presentation.xml")); 

function processXML(e:Event):void { 
    config = new XML(e.target.data); 
    var slide:Slide; 
    for (var i:Number = 0; i < config.slides.slide.length(); i++) 
    { 
     var node = config.slides.slide[i]; 
     slide = new Slide();           
     slides.push(slide); 

     addChild(slide); // Works fine 
    } 

    for each(var slide:Slide in slides){ 
     trace(slide); 
    } 
} 

Я кодирую его здесь, поэтому не могу заверить, что он сработает. Кроме того, у меня нет остальной части кода, поэтому вам придется протестировать его самостоятельно.

+0

Положите «var» перед «слайдом в слайдах», и я буду отмечать вас как ответ! – tags2k

+0

Готово. Извините, это то, что происходит, когда вы пытаетесь импровизировать кодирование! :П – ozke

3

Ваш slides.forEach вызов выполняется до того, как событие увольняют поэтому массив горок не имеет значения.

+0

Да, конечно, это так! Мне нужно перестать думать о C# и начать думать о jQuery ... – tags2k

+0

Ах, но почему меня посылают нулевые элементы? Конечно, если массив пуст, он ничего мне не передает? – tags2k

+0

Я теперь попытался переместить forEach в обратный вызов события, и он все еще не работает :( – tags2k

 Смежные вопросы

  • Нет связанных вопросов^_^