我有一个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传递的。这可能是与这个问题有关的问题吗?
非常感谢任何帮助/评论。这个问题开始影响我的美容睡眠;)
答案 0 :(得分:2)
我的猜测是你在序列化程序上花了很多时间。在应用程序中放置跟踪目标,并在运行时查看控制台以查看正在发送的内容。
最可能的问题来自DisplayObjects - 如果它们已被添加到应用程序中,它们将具有对应用程序本身的引用,并将导致一些序列化程序开始序列化整个应用程序。可绑定对象可能附加了一些最终附加到DisplayObjects的奇怪事件 - 尝试将其中的相关值复制到对象中,而不是仅仅引用现有对象。