проблема синхронизации вызовов методов в actioncript 2.0 XML-функции onLoad () - PullRequest
1 голос
/ 29 июня 2011

Я новичок в ActionScript и пишу код для сетевого устройства, которое поддерживает только ActionScript 2.0.

Я пытаюсь прочитать XML-ленту и извлечь из нее две части текстовых данных (сводку и подробности), а затем отобразить их как два отдельных текстовых поля, изменяя размеры и перемещая текстовые поля, как только я знаю, как долго каждый из нихare.

Я успешно извлек значения из ленты и заполнил поля TextFields с помощью метода XML onLoad ().В конце метода onLoad () я подумал, что могу просто вызвать закрытый метод resizeSummary () моего класса, чтобы сделать это, но по причинам, которые я явно не понимаю в методе onLoad (), я не могу получить свойВызванные методы resizeSummary ().

Я бы сделал вызов resizeSummary () позже в коде, но, похоже, это не имеет значения, потому что onLoad () вызывается только после того, как все остальное сделано,Так что, похоже, существует проблема синхронизации, которую я не знаю, как контролировать.

Самое простое решение было бы, если бы я мог выяснить, как получить метод resizeSummary (), вызываемый в функции xml onLoad ()event.

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

фрагмент кода из моего класса появляется внизуэтого сообщения.

class Foo {
// constructor
function Foo() {
  initSummaryTextField();
  getData();
}

private function getData() {
  var xmlData = new XML();
  xmlData.onLoad = function(success:Boolean): Void {
    if (success) {
      var summary:String = '';

      // successfully extracted summary text at this point and assigned value
      // to TextField .text variable. So I am good to here. 

      // THIS CALL NEVER SEEMS TO BE MADE EVEN THOUGH TRACE STATEMENT
      // IMMEDIATELY PRECEEDING IT DOES.
      trace("About to call resizeSummary()");
      this.resizeSummary();
    }
  }
  xmlData.load("URL TO SERVICE");
}


private function initSummaryTextField() {
  // do stuff here to create new TextField() for summary
}
private function resizeSummary() {
  trace("calling resizeSummary");
}

}

Ответы [ 2 ]

1 голос
/ 05 июля 2011

для анонимной функции onLoad (), определенной в моем классе, вы, очевидно, не можете видеть методы и переменные класса.

Итак, я сделал следующее.Я добавил локальную переменную thisObject, которая ссылается на this и доступна в анонимной функции.

// ADDED THIS LINE TO CREATE A REFERENCE TO this OBJECT. Then withing my annonymous function I can reference thisObject internally.
var thisObject:Foo = this;

xmlData.onLoad = function(success:Boolean): Void {
  if (success) {
  var summary:String = '';

  // successfully extracted summary text at this point and assigned value
  // to TextField .text variable. So I am good to here. 

  // THIS CALL NEVER SEEMS TO BE MADE EVEN THOUGH TRACE STATEMENT
  // IMMEDIATELY PRECEEDING IT DOES.
  trace("About to call resizeSummary()");
  thisObject.resizeSummary();
}

}

1 голос
/ 29 июня 2011

Попробуйте поменять

this.resizeSummary();

на

resizeSummary();

this относится к функции onLoad, поэтому область действия больше не находится на уровне класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...