Flex: передача объекта для сохранения обратно на сервер останавливает приложение - PullRequest
2 голосов
/ 24 января 2012

У меня есть NavigatorContent, который отображается, когда пользователь выбирает элемент в DataGrid.Этот NavigatorContent содержит форму и аккордеон, отображающий связанные объекты.

Когда пользователь нажимает кнопку «Сохранить» в NavigatorContent, форму и дочерние элементы следует сохранить в базе данных, вызвав сервер через BlazeDS:

saveObjectToDB()
{
  //Map the form values to the object
  object.field1 = object_field1.text;
  object.field2 = object_field2.selectedDate as Date;
  object.relatedobject3 = comboBox.selectedItem as RelatedObject3;
  //etc.....

  //Loop through accordion to save the child objects
  for(var i:int= 0; i < accordion.numChildren; i++ )
  {
    if(accordion.getChild(i) is RelatedObject1Form)
    {
      var formRelated1:RelatedObject1Form = accordion.getChild(i) as RelatedObject1Form;
      //Map the form values to the related object
      object.relatedobject1.field1 = formRelated1.relatedobject1_field1.selectedDate;
      //etc...
    }
    if(accordion.getChild(i) is RelatedObject2Grid)
    {
      var gridRelated2:RelatedObject2Grid = accordion.getChild(i) as RelatedObject2Grid;
      //Get dataProvider for the datagrid of the relatedObject
      object.relatedobject2 = gridRelated2.object.relatedobject2;
    }
  }

  // Call the remoting object's saveObject method
  var saveObjectOperation:Operation = new Operation();
  saveObjectOperation.name = "saveObject";
  saveObjectOperation.arguments=[object];
  ro.operations = [saveObjectOperation];
  saveObjectOperation.send();

  if(isNewObject)
    //dispatchEvent new object
  else
    //dispatchEvent object updated
}

Моя проблема заключается в том, что вопрос гласит, что мое приложение зависает на несколько секунд, когда пользователь нажимает кнопку сохранения, вызывающую этот метод.Я предполагаю, что это потому, что Flex является однопоточным, но все же я не совсем понимаю, почему этот метод будет настолько вычислительно дорогим?Кажется, это не имеет значения, если я закомментирую цикл, который зацикливается на потомках аккордеона.

Я пытался установить нулевые объекты, связанные с объектами, перед вызовом метода удаленного сохранения, и это, казалось, ускорило метод сохранения,но позже у меня возникли некоторые проблемы.

Мой вывод заключается в том, что удаленный вызов приводит к зависанию приложения, и если я устанавливаю для связанных объектов значение null, это, похоже, решает проблему.Но действительно ли это необходимо?Связанные объекты на самом деле не такие большие, поэтому я не совсем понимаю, почему удаленный вызов должен заморозить приложение на несколько секунд.

Вот как я создаю дочерние элементы аккордеона, когда инициализируется NavaigatorContent:

    var relatedObjectForm:RelatedObject1Form= new RelatedObject1Form();
    accordion.addChild(relatedObjectForm);
    relatedObjectForm.object= object;
    relatedObjectForm.ro = this.ro;

Объект , который я передаю дочерним элементам аккордеона, является общедоступным и [Bindable] в NavigatorContent и дочерних элементах аккордеона и первоначально передается из основной DataGrid.Может ли это быть проблемой, связанной с этой проблемой?

Любая помощь / комментарии высоко ценится.Эта проблема начинает влиять на мою красоту сна;)

1 Ответ

2 голосов
/ 26 января 2012

Полагаю, вы проводите много времени в сериализаторе. Поместите цель трассировки в приложение и просмотрите консоль при ее запуске, чтобы увидеть, что отправляется.

Наиболее вероятные проблемы связаны с DisplayObjects - если они были добавлены в приложение, у них будет ссылка на само приложение, и некоторые сериализаторы начнут сериализацию всего приложения. К привязываемому объекту могут быть прикреплены некоторые странные события, которые в конечном итоге присоединяются к DisplayObjects - попробуйте скопировать соответствующие значения в нем в свой объект, а не просто ссылаться на существующий объект.

...