Flex:传递对象以保存回服务器冻结应用程序

时间:2012-01-24 09:48:09

标签: flex blazeds

我有一个NavigatorContent,当用户选择DataGrid中的项目时会显示该内容。 此NavigatorContent包含一个表单和一个显示相关对象的手风琴。

当用户按下NavigatorContent中的Save按钮时,表单和子项应通过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,这似乎加快了save方法,但是后来它给我带来了一些麻烦。

我的结论是远程调用是冻结应用程序,如果我将相关对象设置为null,这似乎解决了问题。但这真的有必要吗?相关的对象并不是那么大,所以我不明白为什么远程调用应该冻结应用程序几秒钟。

这是我在NavaigatorContent初始化时创建手风琴儿童的方式:

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

我传递给手风琴儿童的对象是公共的,并且在NavigatorContent和手风琴儿童中是[Bindable],最初是从主DataGrid传递的。这可能是与这个问题有关的问题吗?

非常感谢任何帮助/评论。这个问题开始影响我的美容睡眠;)

1 个答案:

答案 0 :(得分:2)

我的猜测是你在序列化程序上花了很多时间。在应用程序中放置跟踪目标,并在运行时查看控制台以查看正在发送的内容。

最可能的问题来自DisplayObjects - 如果它们已被添加到应用程序中,它们将具有对应用程序本身的引用,并将导致一些序列化程序开始序列化整个应用程序。可绑定对象可能附加了一些最终附加到DisplayObjects的奇怪事件 - 尝试将其中的相关值复制到对象中,而不是仅仅引用现有对象。