`

FLEX ERROR WARNING 总结

    博客分类:
  • FLEX
阅读更多
常会碰到的错误:TypeError: Error #1009: 无法访问空对象引用的属性或方法。

http://hillelcoren.com/2008/09/19/flex-error-1009-cannot-access-a-property-or-method-of-a-null-object-reference/
Flex 2 Runtime Error 1009 and Runtime Modules:
http://life.neophi.com/danielr/2006/07/flex_2_runtime_error_1009_and.html
我碰到的Error #1009:
在一个弹出页面的TitleWindow的写了initialize="initComboBox();"
/**
			 * remark routeN等 都为本titleWindow页的ComboBox组件
			 * */
			private function initComboBox():void {
				///fidsDepfVo不会为null
				remark.selectedIndex = 1;
				route1.selectedIndex = 1;
				route2.selectedIndex = 2;
				route3.selectedIndex = 3;
				route4.selectedIndex = 4;
				route5.selectedIndex = 5;
				route6.selectedIndex = 6;
			}
结果在route1那行代码报了“无法访问空对象引用的属性或方法”;经debug,发现route1及其后的route2-6居然都为null(remark不为null,为ComboBox实例)!(说明下:页面中ComboBOx remark 是定义在 route1-6 六个 ComboBox之前的)。后来将 initialize="initComboBox();" 改为  creationComplete="initComboBox();" ,不再报错。
本次问题表明:了解mxml文件的初始化顺序是至关重要的!不要在initialize中访问本页面的组件,因为这样可能会出现不可预知的错误!
关于Flex Application 初始化顺序:
http://wuaner.iteye.com/blog/1054116





values of type spark.layouts.supportClasses.LayoutBase cannot be represented in text
http://flexspaghetti.wordpress.com/2009/06/13/setting-the-layout-property-in-flex-4/









问题代码:
引用
<s:ComboBox width="124" id="term1" change="select_changeHandler(event, this.term1);"
								dataProvider="{this.parentApplication.terminalDataList}" labelFunction="terminalCombineDisplay" />
private function terminalCombineDisplay(item:Object):String {
				if(null!=item) {
					return StringUtil.substitute("{0}-{1}", item.@code, item.@cname);
				} else {
					return null;
				}
			}
出错:
引用
ReferenceError: Error #1081: 在 Object 上找不到属性 code,且没有默认值。
原因:
引用
Object item 是通过调用remoteObject从后台得的ArrayCollection;而 obj.@atr这种取属性的方式是mx:XMLList才可以用的(貌似是?有待着日再议;反正用在ArrayCollection上确实不行)。
解决办法:取属性时去掉@:
引用
private function terminalCombineDisplay(item:Object):String {
				if(null!=item) {
					return StringUtil.substitute("{0}-{1}", item.code, item.cname);
				} else {
					return null;
				}
			}
总结:之所以犯这个错误,是因为参照了下面的帖子(该帖Combox里放的是mx:XMLList,Combox的labelFunction中使用 obj.@atr 的方式取Combox的item的属性)。总之一句话吧,Copy别人代码,出错在所难免;但倒也能长点知识:
Creating a simple label function on a Flex ComboBox control:
http://blog.flexexamples.com/2007/09/25/creating-a-simple-label-function-on-a-flex-combobox-control/






在<mx:itemRenderer>中使用内联的<fx:Script>时,得到如下Warning:
%s will be scoped to the default namespace: %s internal. It will not be visible outside of this package.

官方解释:
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/compilerWarnings.html
引用
Not declaring a namespace is a coding style preference. Enable this warning if you want to be reminded when you forget to declare a namespace or access specifier for a definition. Without one, the definition is not visible to code located outside of this file. To make it visible to code outside this file, declare it with the access specifier public or with a namespace declaration. To keep the definition local to this file and avoid this warning, declare the definition as private. 
So,出该warning的原因就是未为内联script里的var变量定义加访问修饰符的原因,解决办法就是加上访问修饰符:
http://stackoverflow.com/questions/245155/default-namespace-scope-warning-1084-in-flex-script-file
引用
Stick a private, protected, internal or public before the function declaration:
private function btnBadLogin_onClick():void
这里引出flex的访问修饰符及其可见性:
http://www.flexer.info/2008/01/07/publicprotectedprivateinternalstatic/
引用






Warning:
Data binding will not be able to detect assignments to 'cht1'
出现Warning的代码:
<fx:Binding source="cht1.selectedItem.data" destination="fidsDepfVo.chuter.cht1" twoWay="true"/>

原因:vo chuter未声明为绑定对象。未声明为Bindable。
解决办法:将FidsDepfChuterVo声明为[Bindable]即可:
package com.bcia.fids.ops.depf.entity
{
	[Bindable]  
	[RemoteClass(alias="com.bcia.fids.application.comm.entity.FidsDepfChuter")]
	public class FidsDepfChuterVo
	{
		public function FidsDepfChuterVo()
		{
		}
		
		public var id:String;







一个警告:
warning: unable to bind to property 'data' on class 'Object' (class is not an IEventDispatcher)
警告代码:
<fx:Binding source="domint.selectedItem.data" destination="fidsDepfVo.domint" twoWay="true"/>
警告原因:domint是个ComboBox,其dataProvider是放有Object的ArrayCollection。因为Object不是EventDispatcher,所以当Object的属性change的时候,就无法dispatch "propertyChange"这个事件
Flex Error : class is not an IEventDispatcher:
http://blog.flexuous.com/2006/10/25/flex-error-class-is-not-an-ieventdispatcher/
Flex Warning: Unable to bind to property ‘XXX’ on class ‘XXX’:
http://www.thedesilva.com/2009/02/flex-warning-unable-to-bind-to-property-%E2%80%98xxx%E2%80%99-on-class-%E2%80%98xxx%E2%80%99/
对于一个单个的对象Object,想解决这个问题,使用代理对象 ObjectProxy 来代理原对象是比较好的解决办法:
import mx.events.PropertyChangeEvent;
      import mx.utils.ObjectUtil;
      import mx.utils.ObjectProxy;
      import mx.utils.StringUtil;
           var a:Object = { name: "Tyler", age: 5, ssnum: "555-55-5555" };
      var p:ObjectProxy = new ObjectProxy(a);
      p.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, updateHandler);
      p.name = "Jacey";
      p.age = 2;
      delete p.ssnum;
           // handler function
      function updateHandler(event:PropertyChangeEvent):void
      {
          trace(StringUtil.substitute("updateHandler('{0}', {1}, {2}, {3}, '{4}')",
                                         event.kind,
                                         event.property,
                                         event.oldValue,
                                         event.newValue,
                                         event.target.uid));
      }
           // trace output
      updateHandler('opUpdate', name, Jacey, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
      updateHandler('opUpdate', age, 2, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
      updateHandler('opDelete', ssnum, null, '698AF8CB-B3D9-21A3-1AFFDGHT89075CD2')
[b][size=small]但我现在遇到的问题是:通过remoteObject调用java后台(后台java方法的返回类型为List<ComboBoxEntity>)返回的ArrayCollection中的对象为Object类型。那怎么办那?还是用ObjectProxy,通过遍历远程返回的list逐个代理里头的对象是未尝不可的:
private function onResult(r:ResultEvent) : void {
    var quotes: ArrayCollection = r.result.quotes;
    var wrappedQuotes = new ArrayCollection();
    for each (var quote in quotes)
    wrappedQuotes.addItem(new ObjectProxy(quote))
    view. dataProvider = wrappedQuotes;
}
但如果数据量比较客观,则这个遍历的操作就显得很是不该的。于是想用其他的办法来做。首先想到的是在本地建立一个VO:[/size][/b]
package com.bcia.fids.ops.depf.entity
{
	[Bindable]
	[RemoteClass(alias="com.bcia.fids.application.maintenance.ops.depf.dto.ComboBoxEntity")]
	public class ComboBoxVo
	{
		public function ComboBoxVo()
		{
		}
		public var id:String;  //数据库主键
		public var label:String;  ///显示label(中文名称等)
		public var data:String;  //业务主键code等
	}
}
但经测试后发现,java后台返回的ArrayCollection中存放的仍然是Object!后来通过在mxml文件中通过registerClassAlias注册ComboBoxVo,解决了这个问题,ArrayCollection中存放的对象不再是Object,而变成了需要的ComboBoxVo:
<fx:Script>
		<![CDATA[
			flash.net.registerClassAlias("lasjdlkfajskdfj",ComboBoxVo);
			
			import com.bcia.fids.ops.depf.entity.ComboBoxVo;
...
至此,这个从java后台传回的ArrayCollection中存放的不再是Object,而是我们已经声明为[Bindable]的ComboBoxVo;从而在使用它作为ComboBox的DataProvider,并将这个ComboBox与fidsDepfVo的某属性做双向绑定的时候,不再报这个警告。
从而得出结论:
前台value object和后台pojo的相互转换,必须是相互的。
建立VO对象,并指定其RemoteClass,仅能使前台Vo(这里的ComboBoxVo)在传给java后台后能被识别为java pojo(这里的ComboBoxEntity),即作用于前台FLEX Vo转后台Java POJO的时候。
而对于后台Java POJO转前台Flex Vo,必须在mxml文件中注册Flex Vo
flash.net.registerClassAlias("JAVA端的类全名",AS类名);








Why does adding Bindable to a Getter and Setter Method cause a compiler warning?
http://www.jeffryhouser.com/index.cfm/2008/12/16/Why-does-adding-Bindable-to-a-Getter-and-Setter-Method-cause-a-compiler-warning
  • 大小: 4.8 KB
分享到:
评论

相关推荐

    flex socket开发总结

    Flex Socket开发总结 在开发基于Flex的应用程序时,与服务器进行实时通信是常见的需求,而Socket接口提供了这种能力。本文将深入探讨Flex中Socket开发的关键知识点,包括如何连接到Java和C++的Server Socket,以及...

    在Flex中发布地图 程序报错 SecurityError: Error #2048: 安全沙箱冲突,只需要下载添加这个就可以

    网上的方法很多,我看了好多,但是就是不管用,我的情况是,在程序没发布时,直接运行没错误,但是当发布时,访问就错了,提示SecurityError: Error #2048: 安全沙箱冲突:http://localhost:8086/index.swf 不能从 ...

    Grid Item Flex Error(解决方案).md

    Grid Item Flex Error(解决方案).md

    flex学习笔记 flex学习总结 flex学习教程

    Flex是Adobe公司推出的一种用于构建富互联网应用程序(RIA)的技术,它基于ActionScript编程语言和Flex框架,可以创建交互性强、用户体验优秀的Web应用。本教程是作者精心编写的Flex学习资料,适合初学者入门,通过...

    cairngorm2.2.1 与 flex4的集成. error错误解决

    在本话题中,我们将探讨如何将Cairngorm 2.2.1版本与Flex 4进行集成,并解决可能出现的"error"错误。Flex 4,也称为Gumbo,是Adobe Flex SDK的一个重大更新,引入了Spark组件模型和FXG图形格式,为开发者提供了更多...

    Flex编译错误码总结

    Flex编译错误码总结 Flex是一种基于ActionScript和MXML的开源框架,用于构建富互联网应用程序(RIA)。在开发过程中,我们可能会遇到各种编译错误,这些错误代码可以帮助开发者理解和解决遇到的问题。以下是对Flex...

    Flex知识总结

    flex开发知识总结 flex开发知识总结flex开发知识总结flex开发知识总结flex开发知识总结flex开发知识总结flex开发知识总结flex开发知识总结flex开发知识总结flex开发知识总结flex开发知识总结flex开发知识总结flex...

    Flex-radarChart总结

    #### 四、总结 通过上述介绍,我们可以了解到Flex作为一款成熟的RIA开发框架,在构建复杂且交互丰富的Web应用程序方面具有明显优势。特别是结合雷达图的应用场景,Flex提供了灵活多样的开发方式和强大的图形渲染...

    Flex学习资料总结

    1. **Flex入门知识.docx** - 这个文档可能是对Flex的基本概念和环境设置的介绍,包括安装Flex Builder或Flash Builder IDE,理解Flex SDK,以及创建第一个Flex应用的基本步骤。它可能还会涉及MXML和ActionScript的...

    flex控件应用总结

    个人flex开发总结文档。纯doc手书经验文档,留给还在维护应用Flex技术项目的同仁做参考。

    Flex_RPC错误大全

    这些错误及其解决方法的总结有助于开发者快速定位问题并采取相应措施,提高Flex与.NET之间通信的效率和稳定性。通过深入理解每个错误背后的原理,可以避免常见的陷阱,提升项目的开发效率和用户体验。

    Flex 安全沙箱问题 简单处理方法

    Flex安全沙箱问题是一个在开发基于Adobe Flex的应用程序时经常遇到的问题。Flex作为一个富互联网应用程序(RIA)框架,它使用ActionScript和MXML进行编程,而这些代码在运行时受到安全沙箱的限制,以防止恶意行为。...

    FLEX简单的入门快速总结

    Flex是Adobe公司开发的一种用于构建富互联网应用程序(RIA)的框架,主要基于ActionScript和MXML。本篇文章将深入探讨Flex的基本概念、数据绑定、HTTPService的使用以及创建自定义事件,这些都是Flex入门阶段需要...

    FLEX技术总结20110414

    2011年是Flex技术发展的一个重要阶段,这个时期的总结将涵盖Flex的主要特性、应用领域以及当时的技术趋势。 Flex主要由以下几部分组成: 1. **Flex SDK**:一个开源开发工具包,包含了编译Flex应用程序所需的...

    Flex4.5常见问题总结

    ### Flex4.5常见问题总结 #### 一、Flex4.5组件开发模型与特性 Flex4.5采用了一种基于组件的开发模型,开发者可以通过继承现有组件并扩展其功能来构建自己的应用程序。这一模型的核心优势在于提高了代码的复用性,...

    FLEX培训总结

    【Flex培训总结】 Flex,全称Adobe Flex,是由Macromedia公司推出的,旨在支持富互联网应用程序(RIA)的开发和部署的技术组合。随着Macromedia被Adobe收购,Flex也成为了Adobe的重要产品。Flex主要使用...

    flex的各种特效总结

    Flex是CSS3中的一个布局模式,全称为"Flexible Box",中文可译为“弹性盒模型”。这个模型设计的初衷是为了让复杂的网页布局在不同尺寸和方向的设备上...希望这个Flex特效总结能为你的Web开发之旅带来新的灵感和技巧。

Global site tag (gtag.js) - Google Analytics