我有一个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上——试着将其中的相关值复制到对象中,而不仅仅是引用现有对象。