<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_otto</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/3403/rss</id><updated>2011-01-04T05:03:54Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/3403/rss"/><entry><id>http://www.cnblogs.com/otto/archive/2010/12/31/1923208.html</id><title type="text">java web应用程序的热部署</title><summary type="text">热部署对于程序开发的好处就不用多说了。这里记录一下自己的使用过程：1.myeclipse的年代，那时候通过myeclipse新建的web项目，以debug方式启动，可以获得修改java类中的方法体和jsp页面立即生效的功能支持，这是纯eclipse所没有的。2.后来发现了jrebel可以获得新增java类和方法也无需重启应用服务器即可生效的功能，当然这个功能不完善，有缺陷，比如内存占用变大，加载变慢，间或失效等。3.随着eclipse的升级，推出了JEE版本的eclipse，也就逐渐淘汰了myeclipse，但是JEE版本的eclipse和tomcat配合，即便使用debug模式启动，修改ja</summary><published>2010-12-31T08:03:00Z</published><updated>2010-12-31T08:03:00Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><link rel="alternate" href="http://www.cnblogs.com/otto/archive/2010/12/31/1923208.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/archive/2010/12/31/1923208.html"/><content type="html">&lt;p&gt;热部署对于程序开发的好处就不用多说了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里记录一下自己的使用过程：&lt;/p&gt;&#xD;
&lt;p&gt;1.myeclipse的年代，那时候通过myeclipse新建的web项目，以debug方式启动，可以获得修改java类中的方法体和jsp页面立即生效的功能支持，这是纯eclipse所没有的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.后来发现了jrebel可以获得新增java类和方法也无需重启应用服务器即可生效的功能，当然这个功能不完善，有缺陷，比如内存占用变大，加载变慢，间或失效等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3.随着eclipse的升级，推出了JEE版本的eclipse，也就逐渐淘汰了myeclipse，但是JEE版本的eclipse和tomcat配合，即便使用debug模式启动，修改java类还是会导致整个应用的重新加载，这是不能忍受的，这时候，发现了jetty配合eclipse可以完美的实现热加载，即改即用，很方便。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4.随后又发现了一个叫dcevm的东西，很好的支持了新增java类和方法也无需重启应用服务器即可生效，比jrebel完美。到此，一切都圆满了：）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;5.或者还有更好的方式我没有发现？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ps：发现tomcat 6.20以后的版本机制不一样，修改jsp都被缓存，导致修改刷新不生效，只能用以前的版本，不知为何。。。不过，我现在基本也不用tomcat了&lt;/p&gt;&lt;img src="http://www.cnblogs.com/otto/aggbug/1923208.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/otto/archive/2010/12/31/1923208.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/otto/archive/2010/12/16/1907718.html</id><title type="text">合理使用Module分割项目以及对Module的使用</title><summary type="text">转自：http://bbs.airia.cn/thread-2811-1-1.html这篇介绍module使用的随笔写得不错。现在说说Module，这篇教程代码不是最重要的，怎么样合理的使用Module以及注意的问题才是关键，所以建议大家注意下面红色语句。Module，可以将我们的项目按需划分为N个模块，在编译时将项目编译为主文件以及N个module的swf。Module基本上可以分为两种： 完整的Module,可以被外部app所使用 -- 会将所有涉及到的引用编译到module中，主文件的体积得到缩减，但是Module本身的体积可能会很大，比如Module和主程序都应用了对象C，那对象C会被</summary><published>2010-12-16T03:33:00Z</published><updated>2010-12-16T03:33:00Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><link rel="alternate" href="http://www.cnblogs.com/otto/archive/2010/12/16/1907718.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/archive/2010/12/16/1907718.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;转自：http://bbs.airia.cn/thread-2811-1-1.html&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;这篇介绍module使用的随笔写得不错。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;现在说说Module，这篇教程代码不是最重要的，怎么样合理的使用Module以及注意的问题才是关键，所以建议大家注意下面&lt;span style="color: #cc0000;"&gt;红色&lt;/span&gt;语句。Module，可以将我们的项目按需划分为N个模块，在编译时将项目编译为主文件以及N个module的swf。Module基本上可以分为两种： &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ol type="1"&gt;&#xD;
&lt;li&gt;&lt;span style="font-size: 10pt;"&gt;完整的Module,可以被外部app所使用 -- 会将所有涉及到的引用编译到module中，主文件的体积得到缩减，但是Module本身的体积可能会很大，比如Module和主程序都应用了对象C，那对象C会被编译到主程序以及Module中，这样Module的体积就会很大。&lt;/span&gt;&amp;nbsp; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="font-size: 10pt;"&gt;关联到主程序的Module -- 比如Module和主程序都应用了对象C，那对象C会只编译在主程序中，从而减小Module的体积。我今天主要讲这一种Module,也是我们最常用到的。&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;了解了Module的种类，再简单说说使用Module要注意的地方。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ol type="1"&gt;&#xD;
&lt;li&gt;&lt;span style="color: #cc0000; font-size: 10pt;"&gt;绝对不能在Module以外的地方直接引用Module中的对象。这样Module会被编译到引用它的模块中去，如果从主程序中引用，那么Module就实际上没有效果了。&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="font-size: 10pt;"&gt;既然不能引用，那么建议对Module对象的使用用接口实现。在Module中实现接口方法，在外部使用这个接口不会导致Module被误编译。&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: #cc0000; font-size: 10pt;"&gt;Module可以引用主程序中的东西，但是不要引用其他Module中的东西。&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;Module可以做什么呢？我主要将Module用于以下下两种情况&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ol type="1"&gt;&#xD;
&lt;li&gt;&lt;span style="font-size: 10pt;"&gt;缩减主程序的体积，点击Module功能块时加载Module.&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="font-size: 10pt;"&gt;再入主程序后在用户感觉不到的情况下预加载剩下的Module.&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;现在讲正题，在demo中我这样表现Module的使用。(为了体现Module的意义，主程序生成的大小是原始flex大小248K, module内嵌了两张图片是674K)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ol type="1"&gt;&#xD;
&lt;li&gt;&lt;span style="font-size: 10pt;"&gt;如何创建Module.&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="font-size: 10pt;"&gt;主程序中点击按钮加载Module PictureWindow.&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="font-size: 10pt;"&gt;加载完毕后将模块添加到Box中，并通过接口调用PictureWindow中的方法setSelectIndex()设置显示的图片。&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;strong&gt;1. 如何创建Module.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;可以通过New --&amp;gt; MXML Module --&amp;gt;Optmize for applicaiton --&amp;gt; OK 或者修改任意的已经创建好的Container组建(比如Canvas, panel)标签为Module，再或者继承Module的As class。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;之后确保&amp;ldquo;鼠标右键项目&amp;rdquo;--&amp;gt; Property --&amp;gt; Flex Module &amp;nbsp;中有这个Module,没有的话点Add --&amp;gt; 选择Module的mxml或as文件 --&amp;gt;Optmize for applicaiton -- &amp;gt; OK&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;strong&gt;2. 主程序中点击按钮加载模块PictureWindow.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;这里我使用了ModuleManager来动态加载需要的Module。这比ModuleLoder要灵活的多。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000cc; font-size: 10pt;"&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;private &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; loadModule():&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;      m &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModuleManager.getModule(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;PictureWindow.swf&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;设置Module地址，地址是编译后swf在bin中的位置&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;设置事件监听&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;      m.addEventListener(ModuleEvent.READY,loadReady);&lt;br /&gt;      m.addEventListener(ModuleEvent.PROGRESS,&lt;/span&gt;loading&lt;span style="color: #000000;"&gt;);&lt;br /&gt;      m.addEventListener(ModuleEvent.ERROR,loadError);&lt;br /&gt;      m.load(); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;加载Module&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 10pt;"&gt;&lt;strong&gt;3. 加载完毕后将模块添加到Box中，并通过接口调用PictureWindow中的方法setSelectIndex()设置显示的图片。&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;PictureWindow实现了PictureWindowInterface接口，其中暴露了setSelectIndex方法。&lt;span style="color: #990000;"&gt;再次强调不要直接使用Module对象，如果我们不注意写成&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;var window:PictureWindow &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; e.module.factory.create() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; PictureWindow，那整个Module就前功尽弃了&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;Module加载完成&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; function loadReady(e:ModuleEvent):&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将Module对象转换为PictureWindowInterface&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;   var window:PictureWindowInterface &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; e.module.factory.create() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; PictureWindowInterface&lt;br /&gt;   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.box.addChild(window &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #000000;"&gt; DisplayObject);&lt;br /&gt;   window.setSelectIndex(&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;通过Interface调用Module中的方法&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: #990000;"&gt;&lt;/span&gt;好了，Module的使用就写这么多，看到这里你应该也可以创建自己的Module了，对于ModuleManager和IModuleInfo 中详细的内容，大家可以查阅Flex帮助。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;代码下载请看原文。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/otto/aggbug/1907718.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/otto/archive/2010/12/16/1907718.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/otto/archive/2010/12/16/1907696.html</id><title type="text">自定义真正可重用的Flex组件</title><summary type="text">来源：http://blogs.adobe.com/tomsugden/2009/12/writing_genuinely_reusable_fle.html在大型企业项目里，经常要为Flex 类库写一系列可重用的组件。理论上来说，相同的组件总可以被Flex 或 AIR客户端的modules 和 sub-applications复用，带来高度一致性和快速开发的好处。然而在实际中，有一些错误用法限制了组件的重用性。本文阐述了是什么使得组件真正可重用，并强调了一些在Flex SDK 里使用的技术，以此来编写出更具重用性的自定义组件。什么方法令组件可以真正重用？组件重用性存在不同等级。一个真正可以重</summary><published>2010-12-16T03:14:00Z</published><updated>2010-12-16T03:14:00Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><link rel="alternate" href="http://www.cnblogs.com/otto/archive/2010/12/16/1907696.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/archive/2010/12/16/1907696.html"/><content type="html">&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;来源：&lt;a href="http://blogs.adobe.com/tomsugden/2009/12/writing_genuinely_reusable_fle.html"&gt;http://blogs.adobe.com/tomsugden/2009/12/writing_genuinely_reusable_fle.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="background-color: #ffffff;"&gt;在大型企业项目里，经常要为Flex 类库写一系列可重用的&lt;span &gt;组件&lt;/span&gt;。理论上来说，相同的组件总可以被Flex 或 AIR&lt;span &gt;客户端的&lt;/span&gt;&lt;/span&gt;modules 和 sub-applications&lt;span style="background-color: #ffffff;"&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;复用，带来高度一致性和快速&lt;span &gt;开发&lt;/span&gt;的好处。然而在实际中，有一些错误用法限制了组件的重用性。本文阐述了是什么使得组件真正可重用，并强调了一些在Flex SDK 里使用的技术，以此来编写出更具重用性的自定义组件。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&lt;strong&gt;什么方法令组件可以真正重用？&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="background-color: #ffffff;"&gt;组件重用性存在不同等级。一个真正可以重用的组件应该可以接受任何类型的&lt;span &gt;数据&lt;/span&gt;进行渲染。完全可以适应数组、动态Object或者是Kangaros（具体&lt;span &gt;对象&lt;/span&gt;）的集合。Flex &lt;span &gt;DataGrid&lt;/span&gt; 组件有这样一个属性。&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:DataGrid &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dataProvider&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="{ kangaroos }"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;　　&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:columns&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;　　　　&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:DataGridColumn &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;headerText&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Name"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; dataField&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="name"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;　　　　&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:DataGridColumn &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;headerText&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="Weight"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; labelFunction&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="calculateWeight"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;　　&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:columns&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:DataGrid&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
注意 dataField 和 labelFunction 属性如何通知组件从Kanagroos读取数据，而且对它没有依赖。这两种方法可以使组件重用。即使开发人员不能对Kangaroo 类做修改，比如它在第三方类库，但是他们仍然很容易在&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt;DataGrid 中渲染&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt;这些对象。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&lt;strong&gt;数据接口反模式&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="background-color: #ffffff;"&gt;一个普遍的错误是把组件渲染的数据，去实现指定接口。例如：一个分布栏组件渲染简单图片，如下图：&lt;br /&gt;&lt;/span&gt;&lt;span  style="display: inline;"&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/1433/2010121610570387.png" alt="" /&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="background-color: #ffffff;"&gt;分布栏显示不同大小的地区，每个都有个标示，通过使用IRegion 对象数组进行设计。&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IRegion{&lt;br /&gt;　　function &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt; label() : String;&lt;br /&gt;　　function &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt; size() : &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
这个分类栏会通过IRegion接口提取size 和 label 信息来渲染每个区域。理论上这个接口让组件和实际对象解耦了，任何实现该接口的类都可以被渲染。实际上这是设计上的错误。使用Iregion 接口令重用性有了限制。使用这&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt;个&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt;组件前，一定需要把这&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt;个&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt;接口&lt;span &gt;加载&lt;/span&gt;进原有的数据类里。 更坏的情况是，这些数据类可能在另外的类库，或是在另一开发小组。因而不得不把这&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt;个&lt;/span&gt;&lt;span style="background-color: #ffffff;"&gt;接口加载进来。导致组件并不是真正的可重用。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&lt;strong&gt;可重用的Flex SDK组件&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;Flex SDK 提供很多可重用的组件，它们的实现有以下一些标准方法：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;1.Data Fields&lt;br /&gt;2.Data Functions&lt;br /&gt;3.Data Descriptions、&lt;br /&gt;4.Factory Objects&lt;br /&gt;现在就说明下这些方法。使用这些技术可以令到自定义的组件具有真正的重用性。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="font-size: 10pt;"&gt;&lt;strong&gt;&lt;span style="background-color: #ffffff;"&gt;Data Fields&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;Data field 是一个字符型属性。代表另外属性名称。例如：ComboBox 的 labelField 或者DataGridColumn 的dataField 、dataTipField 属性。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:ComboBox &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dataProvider&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="{ items }"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; labelField&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="name"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;组件的实现是使用 dataField 去读取 items 属性值。如：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; each (var item:Object &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; dataProvider){&lt;br /&gt;　　var value:Object &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; item[dataField];&lt;br /&gt;　　&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; do something with the value&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;这是个很简单的方法，但提供很大灵活性。这组件可以读取任何对象的任何属性。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&lt;strong&gt;Data Functions&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;Data Function 是个函数类型。代表另外函数的引用。如：ComboBox 的 labelFunction 或DataGridColumn 的 dataFunction 属性。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:DataGridColumn &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;headerText&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="weight"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; dataFunction&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="calculateWeight"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;这组件然后调用dataFunction，一般用data 的item 作为参数。如：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="background-color: #ffffff;"&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; each (var item:Object &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; dataProvider){&lt;br /&gt;　　var value:Object &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; dataFunction(item);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;　　//&lt;/span&gt;&lt;span style="color: #008000;"&gt; do something with the value&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/span&gt;这种方法和 dataField 差不多，但使用更灵活了。因为在组件渲染之前，可以通过函数来计算或格式化返回值。&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&lt;strong&gt;Data Descriptions&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;Data description 是一个接口，组件可以使用它来分析渲染数据。开发者可以使用自己实现的接口来处理组件的渲染数据。在Tree 组件可以看到&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:Tree &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dataProvider&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="{ items }"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;　　&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:dataDescriptor&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;br /&gt;　　　　&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;my:MyDataDescriptor&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;br /&gt;　　&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:dataDescriptor&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:Tree&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;Tree 可以使用dataDescription 接口分析数据特性。如：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; each (var item:Object &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; dataProvider){&lt;br /&gt;　　var isBranch:Boolean &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; dataDescriptor.isBranch(item, dataProvider);&lt;br /&gt;&lt;/span&gt;　　&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; do something with the outcome&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
这个方法非常强大，不过一般只用在复杂的组件。如 Tree。开发者如果要在Tree渲染一个新的类，他们要自行实现ITreeDataDescriptor 接口。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&lt;strong&gt;Factory Objects&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;Factory Object 是一个 IFactory 属性，用于动态生成实例。如：List 和DataGrid 的 itemRenderer 和 ComboBox 的dropdownFactory 属性。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;mx:List &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dataProvider&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="{ items }"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; itemRenderer&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="my.package.MyItemRenderer"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;这个组件使用Flex SDK 的标准IFactory 接口来创建实例。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; itemRenderer:Object &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; itemRenderer.newInstance(); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;然后把data items 给IDataRenderer 接口创建的实例赋值&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (itemRenderer &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;is&lt;/span&gt;&lt;span style="color: #000000;"&gt; IDataRenderer){&lt;br /&gt;　　IDataRenderer(itemRenderer).data &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; item;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;这种方法提供操作部分组件的视图外观。通过提供自定义的itemRenderer，可以达到完全不同的结果。处理数据的逻辑的复杂程度可以根据需求来决定。而且还可以封装在ItemRenderer 类里面。前面提到，组件使用工厂（Factories）时候，应该定义有意义的默认值。所以组件可以直接使用，不需要设置特别的Factories。所有 的ListBase组件都提供了默认值。如DataGrid 默认是DataGridItemRenderer。&lt;br /&gt;这里值得注意是Flex 编译器和IFactory 有特别关系。当这个属性在MXML 设置了，会自动转换成类名字，然后把ClassFactory 的实例嵌入到组件里。这样使得组件更容易使用，开发者不用手动去实例对象。只需指定类名或定义一个嵌入组件。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;当需要重用组件时，要记住这简单的规则：一个可重用的组件应该可以渲染任何类型的数据。最好的实现方法是遵守Flex SDK的约定：data fields, data functions, data descriptors 和 object factories。要注意的是反对使用自定义的接口来限制你的组件重用性。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;&lt;strong&gt;附言&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff; font-size: 10pt;"&gt;可重用组件习惯使用动态属性，这里做了些权衡取舍。因为访问动态属性比强类型属性慢。而且没有编译期的类型检测。然而它的好处是使用更灵活，更少依赖。&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/otto/aggbug/1907696.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/otto/archive/2010/12/16/1907696.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/otto/archive/2009/02/17/1392701.html</id><title type="text">hp的笔记本真垃圾</title><summary type="text">07年6月买的到dv2530，原来一直散热不好，热的都可以煮鸡蛋了。这我都忍了，现在毛病越来越多，待机经常待不了，电源一直亮着，cpu根本不停转。现在机身自带的触摸鼠标又不灵了。nnd，当初真是瞎了眼了。我发誓，这是我买的最后一件hp的东西还是apple的东西好啊，经常让你觉得物有所值。</summary><published>2009-02-17T12:00:00Z</published><updated>2009-02-17T12:00:00Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><link rel="alternate" href="http://www.cnblogs.com/otto/archive/2009/02/17/1392701.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/archive/2009/02/17/1392701.html"/></entry><entry><id>http://www.cnblogs.com/otto/archive/2009/01/11/1373857.html</id><title type="text">关于fusionchart的使用</title><summary type="text">今天过来，发现居然有网友给我留言，问我怎么在项目中使用fusionchart。真是意外，我一直都只把这个blog当做自己的网络记事本，有心情的时候才会在上面随手涂鸦，自己都很少看。至于fusionchart的使用，其实很简单，不过最近比较忙，也没时间去整理一个教程出来。况且，这个东西用的人也不多吧。</summary><published>2009-01-11T15:07:00Z</published><updated>2009-01-11T15:07:00Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><link rel="alternate" href="http://www.cnblogs.com/otto/archive/2009/01/11/1373857.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/archive/2009/01/11/1373857.html"/></entry><entry><id>http://www.cnblogs.com/otto/archive/2009/01/11/1373614.html</id><title type="text">RIA 过渡期的选择</title><summary type="text">虽说flex3很好很强大，但实际的项目是不可能完全更新到flex平台的，这时候，要想取得炫目的富客户端效果，就只有祭出js了！话说现在的js界，那真是豪强并起，群雄逐鹿有full stack的extJs,Dojo有小巧精干的prototype有简练强大的jquery有很OO的mootools还有。。。extJs提供的功能是很全，但是太重了，虽说可以采用OPOA的做法，然后极尽可能的去压缩它，但我不...</summary><published>2009-01-11T03:59:00Z</published><updated>2009-01-11T03:59:00Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><link rel="alternate" href="http://www.cnblogs.com/otto/archive/2009/01/11/1373614.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/archive/2009/01/11/1373614.html"/></entry><entry><id>http://www.cnblogs.com/otto/archive/2008/09/11/1288920.html</id><title type="text">flex3很强大</title><summary type="text">说实话，我一直对漂亮的东西很感冒。n年前就用flash做过留言本之类的小应用。效果很炫，可惜开发起来还是麻烦。 现在再来看flex，发现它已然发展的很强大了！界面的可视化拖拽开发，强大的as3，与后台方便的交互，不愧是RIA的方向啊 恩，很好，花点时间研究一下，先做个crud的demo，把它作为展现层替换掉我脚手架中的struts2。再来弄一些比较炫的玩意。</summary><published>2008-09-11T02:42:00Z</published><updated>2008-09-11T02:42:00Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><link rel="alternate" href="http://www.cnblogs.com/otto/archive/2008/09/11/1288920.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/archive/2008/09/11/1288920.html"/></entry><entry><id>http://www.cnblogs.com/otto/archive/2008/08/08/1263450.html</id><title type="text">完美封装了fusionchart </title><summary type="text">做了一个demo完全基于对象的操作，完全支持setDataXml，setDataUrl，完全支持中文，完全不带水印的flash，完全简单的java对象和xml数据绑定，完全支持简单和复杂图形的操作。。。怎么这么像广告 ，呵呵</summary><published>2008-08-08T01:38:00Z</published><updated>2008-08-08T01:38:00Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><link rel="alternate" href="http://www.cnblogs.com/otto/archive/2008/08/08/1263450.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/archive/2008/08/08/1263450.html"/></entry><entry><id>http://www.cnblogs.com/otto/archive/2008/07/25/1251380.html</id><title type="text">eclipse 突然不能自动编译了</title><summary type="text">很奇怪，突然不能自动编译了，非得点击手动编译才行。而且肯定不是项目配置问题，原来都是可以自动编译的。现在是所有项目都不能自动编译了。google到网友说的那些，什么jar包引用啊，jdk引用啊都不适用于我的情况。 没有办法了，把eclipse 删掉，把备份的eclipse copy过来，就可以了！！！当然，我的workspace是独立于eclipse的，这是因为eclipse升级太快，我经常更换e...</summary><published>2008-07-25T07:06:00Z</published><updated>2008-07-25T07:06:00Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><link rel="alternate" href="http://www.cnblogs.com/otto/archive/2008/07/25/1251380.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/archive/2008/07/25/1251380.html"/></entry><entry><id>http://www.cnblogs.com/otto/archive/2008/07/24/1250819.html</id><title type="text">FusionCharts 的中文问题</title><summary type="text">最近有个咨询项目使用图表。原本采用IBM的dashboard，无奈IBM的东西众所周知的不好用，让我指导别人，很郁闷的！于是下载了FusionCharts，效果很炫，而且数据采用xml格式，服务器端容易生成，就它了。但我发现new 出FusionCharts对象后，使用setDataURL方法设置xml数据，flash展现的时候居然不支持中文，而且怎么设置编码格式都不行，而用setDataXML就...</summary><published>2008-07-24T10:59:00Z</published><updated>2008-07-24T10:59:00Z</updated><author><name>otto</name><uri>http://www.cnblogs.com/otto/</uri></author><link rel="alternate" href="http://www.cnblogs.com/otto/archive/2008/07/24/1250819.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/otto/archive/2008/07/24/1250819.html"/></entry></feed>
