`

FLEX : ObjectProxy & <fx:Model> tag

    博客分类:
  • FLEX
阅读更多
今天碰到了一个非常让我困扰的问题,使我觉得很有必要对Object的可绑定代理对象ObjectProxy做一个单独的说明;而<fx:Model>,在编译时正是会被编译为ObjectProxy类型(The most common type of MXML-based model is the <fx:Model> tag, which is compiled into an ActionScript object of type mx.utils.ObjectProxy, which contains a tree of objects when your data is in a hierarchy, with no type information. The leaves of the Object tree are scalar values)。

关于数据绑定的帖子导航:
http://wuaner.iteye.com/blog/1056650
关于 warning: unable to bind to property 'cntCt' on class 'Object' (class is not an IEventDispatcher) 导航:
http://wuaner.iteye.com/blog/1054153


问题描述:
两个级联弹出的模态窗口TitleWindow;一级窗口中有名为counterDg的datagrid,其dataProvider为名为counterAC的arrayCollection。二级窗口对一级窗口中的counterDg中数据做增删改(实际就是对counterDg的dataProvider counterAC做增删改;这里的增删改,并不会提交后台,在一级窗口被提交后才会做提交后台的动作)。最开始时,counterAC中存的是Object
问题就出在二级窗口中对一级窗口counterDg做修改的时候
改的时候是需要将数据带到二级窗口的,自然一级窗口counterDg.selectedItem会有向二级窗口输入域的单向绑定(这里不应该用双向绑定,因为双向绑定的话,在二级窗口中对绑定的数据做修改,会立即触发一级窗口dataGrid中当前选定行随之而改变,即使你连“提交”按钮都没点;这显然是不合逻辑的。),如:
<!-- 切记这里不适合配双向绑定  @{counter.cntOt}  -->
<mx:FormItem label="开放时间:">
	<myDateTime:DateTimeSelectorFinal id="cntOt" selectedDate="{counter.cntOt}"/> 
</mx:FormItem>
因为counterAC中放的是Object,二级窗口中自然也用一个Object接一级窗口dataGrid的选定项:
[Bindable]
public var counter:Object;

在二级窗口点击提交按钮的方法中,集中做反向的绑定工作:使用BindingUtils动态的将页面输入域的值绑定回counter:
if(null != counter) {  //修改
					BindingUtils.bindProperty(counter, "cnt", cnt, ["selectedItem","data"]);
					BindingUtils.bindProperty(counter, "cntCls", cntCls, ["selectedItem","data"]);
					BindingUtils.bindProperty(counter, "cntOt", cntOt, "selectedDate");
					BindingUtils.bindProperty(counter, "cntCt", cntCt, "selectedDate");
					BindingUtils.bindProperty(counter, "cntPot", cntPot, "selectedDate");
					BindingUtils.bindProperty(counter, "cntPct", cntPct, "selectedDate");
					PopUpManager.removePopUp(this);
} else { //增加
					//add item into counterDg's dataProvider : counterAC
					this.dispatchEvent(new Event("addCounter")); 
}
因为counter为Object类型,自然这个警告及时出现了:
warning: unable to bind to property 'cntCt' on class 'Object' (class is not an IEventDispatcher)
这时候让我费解的情况发生了:尽管有上面的警告,但通过debug跟踪,发现二级页面的输入域的值还是被成功绑定到了一级TitleWindow的counterAC,counterAC的值已经变成了变化后的值;但怪就怪在:使用counterAC作为dataProvider的counterDg没有随着二级TitleWindow的关闭而自动刷新!但通过滚动counterDg的滚动条,使更新的数据行在可见区域中不可见,再滚回来后,你会发现counterDg中刚才错误的数据行变成正确的了!
明明警告我说“不能绑定Object的属性xxx”,却还绑定成功了;刚要以为这个警告无关紧要,却发现绑定仅仅对counterAC起了作用,可是却不会刷新使用counterAC作为dataProvider的counterDg,这算什么个事啊。。。
既然有这样的问题存在,那就从警告入手,着手解决。通过将counterAC中放ObjectProxy对象而不是放Object对象,来解决掉这个警告:
//counterAC初始化的改动:
var counter1:Object = new Object();
counter1.xxx = "yyy";
...
counterAC.addItem(new ObjectProxy(counter1)); //由原来的直接放Object,改为放ObjectProxy

//二级页面中接受一级页面dataGrid当前选定行的变量counter也改为ObjectProxy类型:
[Bindable]
public var counter:ObjectProxy; 

//一级页面修改函数在为二级页面counter赋值时也赋ObjectProxy:
protected function editFidsDepfCounterHandler(event:MouseEvent):void
			{
				//DateGrid的selectedItem返回的是Object类型
				var selectedItem:Object = counterDg.selectedItem;
				if(null == selectedItem) {
					Alert.show("请选择要修改的记录!");
				} else {
					var win : AddFidsDepfCounterWindow = new AddFidsDepfCounterWindow();
					win.counter = new ObjectProxy(selectedItem);
					win.title="修改";
					PopUpManager.addPopUp(win,this,true);
					PopUpManager.centerPopUp(win);
				}
			}


增加时,通过addItem加到一级页面counterAC中的也应该是ObjectProxy:
引用
//二级页面中:
<fx:Declarations>
		<!-- <fx:Model> tag  is compiled into an ActionScript object of type mx.utils.ObjectProxy -->
		<fx:Model id="addCounterInfo">
			<counter>
				<cnt>{cnt.selectedItem.data}</cnt>
				<cntCls>{cntCls.selectedItem.data}</cntCls>
				<cntOt>{cntOt.selectedDate}</cntOt>
				<cntCt>{cntCt.selectedDate}</cntCt>
				<cntPot>{cntPot.selectedDate}</cntPot>
				<cntPct>{cntPct.selectedDate}</cntPct>
			</counter>
		</fx:Model>
	</fx:Declarations>
//一级页面中:
protected function addFidsDepfCounterHandler(event:MouseEvent):void
{
				var win : AddFidsDepfCounterWindow = new AddFidsDepfCounterWindow();
				win.title="增加";
				win.addEventListener("addCounter", saveNewCounter); 
				PopUpManager.addPopUp(win,this,true);
				PopUpManager.centerPopUp(win);
}
protected function saveNewCounter(event:Event):void
{
				//trace(event);
				var win:AddFidsDepfCounterWindow = event.target as AddFidsDepfCounterWindow;
				counterAC.addItem(win.addCounterInfo); //因为addCounterInfo是通过<fx:Model>定义的,所以它本省就是个ObjectProxy类型的对象
				PopUpManager.removePopUp(win);
}


至此,问题解决,一级页面dataGrid在二级页面点击确定后被成功刷新,也没有了刚才的警告。
明白了一个道理:flex中的warning不比error影响力小!千万不能置之不理!




关于ObjectProxy:
Using Flex 4.5 / Using data-driven UI components / Storing data 
  -> Defining a data model:
     http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7b51.html#WS2db454920e96a9e51e63e3d11c0bf66ba1-7ffb

引用
The most common type of MXML-based model is the <fx:Model> tag, which is compiled into an ActionScript object of type mx.utils.ObjectProxy, which contains a tree of objects when your data is in a hierarchy, with no type information. The leaves of the Object tree are scalar values. Because models that are defined in <fx:Model> tags contain no type information or business logic, you should use them only for the simplest cases. Define models in ActionScript classes when you need the typed properties or you want to add business logic.

  -> Using a data model as a value object:
     http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf66ba1-7ff7.html



under the hood flex data model using the fx:model and fx:xml tags:
http://elromdesign.com/blog/2009/07/20/under-the-hood-flex-data-model-using-the-fxmodel-and-fxxml-tags/





通过remoteObject调用后台得到的result也可能本身就是ObjectProxy类型的,只要:
http://tech.groups.yahoo.com/group/flexcoders/message/66621
引用
You'll have to determine why an ObjectProxy is being created... typically it's because an anonymous Object was returned and RemoteObject had makeObjectsBindable="true" (which it is by default).
我的返回结果为ObjectProxy的例子:
引用
java后台,返回类型是Map:
public Map<FidsDevice, List<FidsChannelRefDev>> findDevAndChannelByDevId(String devId) {
		return this.iFidsDeviceService.findDevAndChannelByDevId(devId);
	}
flex前台,makeObjectsBindable="true":
<mx:RemoteObject id="iFidsDeviceFlexService" destination="iFidsDeviceFlexService" makeObjectsBindable="true"> 
			<mx:method name="findDevAndChannelByDevId" result="devAndChannelDataHandler(event)" >
				<mx:arguments>
					<id>{updatedDevId}</id>
				</mx:arguments>
			</mx:method>
		</mx:RemoteObject>







使用ObjectProxy时有个注意事项:
http://www.smithfox.com/?e=96
引用
只能处理当前所代理类的直接属性, 不能感知nested field property变化, 这明显和它声明实现IPropertyChangeNotifier接口是不符的.

分享到:
评论

相关推荐

    flex解决textarea,input不能输入中文的方法

    首先通过设置 `&lt;object&gt;` 或 `&lt;embed&gt;` 标签的 `wmode` 属性来改善与浏览器的交互,然后通过调整Flex应用的背景颜色来避免透明度问题,最后通过启用IME支持来确保中文输入法的正常工作。这些步骤不仅可以提高用户...

    urdfdom-1.0.4-9.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统urdfdom-1.0.4-9.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf urdfdom-1.0.4-9.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    Telescan PE v1.54 资源包:PCIE设备管理的利器

    项目介绍 在现代计算机系统中,PCIE(Peripheral Component Interconnect Express)设备扮演着至关重要的角色。为了更好地管理和配置这些设备,我们推出了 Telescan PE v1.54 资源包。这个资源包提供了一个强大的工具集,能够帮助用户在Windows和Linux操作系统上显示PCIE设备的拓扑结构和参数配置。无论您是系统管理员、硬件工程师还是开发人员,这个资源包都能为您提供极大的便利。 项目技术分析 Telescan PE v1.54 资源包的核心技术在于其能够跨平台运行,支持Windows和Linux操作系统。这意味着用户无需担心操作系统的限制,可以在不同的环境中无缝使用。资源包中包含了用于显示PCIE设备拓扑结构和参数配置的相关工具和数据,这些工具经过精心设计,能够高效地解析和展示PCIE设备的详细信息。 项目及技术应用场景 系统管理员:系统管理员可以使用 Te

    2025年江苏扬州公交路线及站点矢量shp数据.zip

    2025年江苏扬州公交路线及站点矢量shp数据.zip

    Matlab实现基于TVFEMD-IMF能量熵增量的数据降噪方法的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档介绍了基于 Matlab 实现的 TVFEMD-IMF 能量熵增量的数据降噪方法的具体项目实例,详细展示了从理论背景、项目特点到实现细节及应用领域的方方面面。文章首先介绍了项目的背景与意义,重点解决了非平稳信号中的噪声成分对后期数据分析带来的难题。文中提到的关键技术——时间变分滤波经验模态分解(TVFEMD),以及通过引入能量熵增量来进行自动选择IMF的有效方法。项目采用模块化设计理念,实现了从数据导入、TVFEMD分解、熵增量化计算直至最终信号重构全过程,并附带有详尽的代码解析与图形展示,便于理解和验证。除此之外,还包括详细的GUI界面开发指导和技术延伸讨论,探讨了如深度学习结合的可能性。 适合人群:具有一定数学建模和信号处理基础知识的专业人士,尤其是那些从事信号分析与降噪工作的科研工作者和工程师。 使用场景及目标:①适用于对各种复杂工况下(如工业、医药、通信等行业)所收集的非平稳、易混杂有强噪声的实际信号做前期净化;②为这些信号的后续精确特征抽取、故障诊断以及其他更高层次的研究打下良好基础;③同时提供了一个开放性的技术交流框架,鼓励进一步的技术革新和跨学科合作。 其他说明:该项目强调实用性和可操作性,不仅限于单一行业内的简单降噪任务,更致力于构建一套通用性强、拓展性高的信号处理工具包。同时也在积极探寻与其他前沿技术相衔接的发展道路,比如借助大数据分析、人工智能算法等现代科技手段,力求达到更佳的降噪成效并拓宽其应用范围。另外值得注意的是,为保证算法高效运行及结果可信,开发者还需关注数据质量预处理环节、合理挑选参数配置,做好边界条件处置等工作,以确保最佳的整体效果。

    基于STM32的信号发生器(代码版):正弦波、三角波、矩形波输出,4.3寸LCD显示及可调频率与波形控制.pdf

    基于STM32的信号发生器(代码版):正弦波、三角波、矩形波输出,4.3寸LCD显示及可调频率与波形控制.pdf

    计算机组成与体系结构:进制转换及计算机数据表示与处理

    内容概要:本文深入探讨了计算机组成与体系结构的基础知识。首先,文中详细阐述了不同进制间的转换方法及二进制与其他进制间的相互转换法则,并着重介绍了二进制的加减法规则。随后讲述了数据在计算机内的编码方式——如原码、反码、补码、移码等,及其运算原理和使用场景,特别是解释了补码的优越性和其在机器中运算的独特性质,解决了原有数据表示存在的问题,扩展了可表示数值的范围。接下来讨论了CPU的基本构成,包括运算器、控制器、寄存器等部件的工作机制,进一步解析流水线技术和指令执行周期计算。在存储方面涵盖了存储层次架构、缓存设计思路、虚拟内存管理等内容,还涉及到总线系统的分类及可靠性计算等相关主题。最后提及了不同类型检验码的作用与应用,以及磁盘结构参数等专题。 适合人群:面向对计算机底层知识有一定兴趣或初步掌握的读者群,特别是正在学习或研究计算机相关专业的大学生或工程师。 使用场景及目标:适用于教学环境下的计算机专业课程讲解辅助材料、个人自学参考资料、技术面试复习指南等用途,旨在加深理解和巩固记忆重要的知识点,培养学生的实际动手能力和解决问题的思维能力。 其他说明:通过对本文的学习可以帮助学员更好地理解计算

    数学建模大赛中的数据结构详解:常用结构、场景应用与优化技巧

    内容概要:本文详细分析了数学建模大赛中常见的数据结构及其应用场景、优化技巧和实战案例,旨在帮助参赛团队高效地处理数据。文章首先阐述了数据结构的核心作用——包括数据组织、算法加速、空间优化以及逻辑映射;接着分类介绍了线性结构、树形结构、图结构和高级结构的特点和典型应用场景,例如用哈希表进行快速查找,通过NumPy提高矩阵运算速度等;然后给出了一套基于问题特征的数据结构选择方法论,并通过两个实例(城市交通流量预测、疫情传播模拟),展示了如何综合运用多种数据结构解决问题;最后提出了关于空间换时间、数据压缩及索引优化等方面的技巧,推荐了若干学习资源及工具库。 适合人群:参加全国大学生数学建模比赛或其他相关赛事的学生队伍;对计算机科学中的数据结构和算法感兴趣的研究人员。 使用场景及目标:为建模团队提供理论指导和技术支持,便于他们选择合适的抽象数据类型来表示具体对象,优化程序性能;使队员能够熟练应用所学的数据结构进行高效的问题求解;帮助参与者理解不同类型的比赛题目可能涉及的不同侧重点并作出准备。 阅读建议:考虑到实际比赛环境中需要灵活运用各类数据结构的知识,读者应当深入研究文中列举的实际例子,并动手练习给出的小段代码;此外,在备战阶段可以根据本文提出的高频考察领域开展针对性复习。对于新手来说,可以从最简单的基本概念出发,逐步建立起完整而系统的认知体系。

    操作终端系统软件:巴合曼电子操作与监控设备软件功能及配置解析

    内容概要:本文档主要介绍了 Bachmann Electronic GmbH 的操作终端系统软件,专为可视化与操作以及操作与监控设备设计。软件系统主要包括嵌入式 Linux 和 Windows 操作系统的组合及其他巴合曼特有的组件。该系统预装了工业浏览器、多种配置和诊断工具以及其他有助于开发的应用软件,例如 FTP 服务器、NTP 客户端等。此外,文中提及软件可通过浏览器和 SolutionCenter 平台远程配置和诊断;提供了对特定操作如 LED 控制等的 API 接口支持,也提到开机动画自定义等高级设定选项。文档还详细解释了 TSSW——一种密码受保护的基于Web配置工具,支持网络配置、防火墙设定等多种任务。总体来说,该软件的设计旨在提升设备管理和维护的便捷性和效率,确保系统稳定性和安全性的同时,简化日常操作。 适合人群:对操作终端系统有研究兴趣的技术人员,或者正使用、考虑引入 Bachmann 监控与操作设备的企业IT管理员。 使用场景及目标:企业需要部署高效的现场设备监测、控制中心或人机交互界面(HMI)时选择合适的软硬件搭配;IT管理人员寻找能够远程快速配置、维护和支持现场

    Go语言的简洁架构.pdf

    Go语言的简洁架构

    加载mp4 xxxxxxxxxxxxxxxxxxx

    加载mp4 xxxxxxxxxxxxxxxxxxx

    uwsgi-plugin-ssi-2.0.27-4.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统uwsgi-plugin-ssi-2.0.27-4.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf uwsgi-plugin-ssi-2.0.27-4.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    2012-2021年深圳市各区卫生技术人员数量

    卫生技术人员是指在医疗卫生机构中从事医疗、护理、药剂、检验、影像等专业技术工作的人员。他们包括执业(助理)医师、注册护士、药师(士)、技师(士)等

    大模型常考面试题总结(含答案).pdf

    大模型常考面试题总结(含答案).pdf

    智能工业装备操作系统的革新与关键技术-推动中国制造2025发展战略

    内容概要:本文聚焦了智能工业装备操作系统的前沿技术和创新发展,尤其针对于‘中国制造2025’战略背景下。文中详细探讨了这类操作系统的重要性及其四方面关键需求——即关键性能、智能化水平、信息安全与功能安全。同时阐述了由中兴通讯提出并自主研发的一系列创新解决方案和技术手段,包括安全可靠的微内核架构、嵌入式虚拟化、健康管理等技术来保障上述需求,进而服务于未来的通信、汽车行业以及其他工业控制系统。 适合人群:对于智能制造和工业控制感兴趣的研究者和工程师。 使用场景及目标:本文有助于理解和实现智能工业装备制造中所需的高可靠性操作系统平台,特别是在需要严格满足安全性与功能性指标的应用场合,例如无人驾驶车辆控制系统或航空航天电子设备。同时也适用于寻求通过先进的技术实现工业自动化转型的企业和机构。 其他说明:本文还强调了智能工业设备的发展前景,并提到操作系统将成为下一代制造业升级的核心组成部分之一,是实现智能制造的重要载体。

    蚂蚁大模型存储加速实践-刘键(1).pdf

    QCon+AICon北京大会演讲 PPT 合集

    郴州市乡镇边界,矢量边界,shp格式

    矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用

    ArcGIS Server 软件授权

    到期日期:2033年1月1日 软件版本: 10.4.1《内部版本 5686) 亲测有效

    人工智能通信服务白皮书(2025年).pdf

    人工智能通信服务白皮书(2025年).pdf

    Mastering Large Language Models with Python - 2024.pdf

    Arun Raj - Mastering Large Language Models with Python - 2024.pdf

Global site tag (gtag.js) - Google Analytics