Flex:将要保存的对象传递回服务器会冻结应用程序



我有一个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,这似乎加快了保存方法的速度,但后来它给我带来了一些麻烦。

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

当NavigatorContent初始化时,我就是这样创建手风琴儿童的:

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

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

非常感谢您的帮助/意见。这个问题开始影响我的美容睡眠;)

我的猜测是您在序列化程序中花费了大量时间。在应用程序中设置一个跟踪目标,并在控制台运行时查看发送的内容。

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

相关内容

  • 没有找到相关文章

最新更新