Posts Mentioning RSS Toggle Comment Threads | Keyboard Shortcuts

  • admin 2:39 pm on 2010年03月8日 Permalink | 登录留下评论  

    flex RESULT_FORMAT_E4X对象转化为ArrayCollection 

    刚接触flex. 在用HTTPService获取XML格式数据再绑定给DataGrid时.遇到一个很”奇怪”的问题

    就是当xml的条目小于等于1时,就会出错. 很是郁闷了一段时间

    后来才发现.问题即不是出在HTTPService上,也不是出在DataGrid上.而是出在 RESULT_FORMAT_E4X 型数据类型转化为ArrayCollection上

    原来 event.result  返回的是object.  当一条记录时,赋给集合,那肯定是有问题
    如果返回多于1条, 就会认为是集合.  再赋出ArrayCollection或绑定DataGrid就没问题了
    所以返回的object 一定要转化.

    以下的代码就不会出错了.

    <?xml version=”1.0″?>
    <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”;>

        <mx:Button label=”Button” click=”g();”/>

        <mx:DataGrid id=”dg” width=”100%” height=”100%”>
            <mx:columns>
            <mx:DataGridColumn dataField=”a”/>
            <mx:DataGridColumn dataField=”b”/>
            <mx:DataGridColumn dataField=”c”/>
            </mx:columns>
        </mx:DataGrid>
        <mx:Script>
            <![CDATA[
                import mx.collections.ArrayCollection;
                import mx.rpc.events.ResultEvent;
                import mx.rpc.http.HTTPService;
                [Bindable]
                private var xmls:ArrayCollection=new ArrayCollection();
                private var hs:HTTPService=new HTTPService();
                private function g():void
                {
                    hs.url=”http://localhost:8081/test.php?”; + Math.random().toString();
                    hs.resultFormat=HTTPService.RESULT_FORMAT_E4X;
                    hs.addEventListener(ResultEvent.RESULT, r);
                    hs.send();
                }
                private function r(event:ResultEvent):void
                {
                    var xml:XML=event.result as XML;
                    for each (var xm:XML in xml.item)
                    {
                        xmls.addItem(xm);
                    }
                    dg.dataProvider=xmls;
                }
            ]]>
        </mx:Script>
    </mx:Application>

     
  • admin 12:15 am on 2010年01月21日 Permalink | 登录留下评论
    Tags: flex3 ComboxBox   

    Flex3的ComboBox怎么感觉这么弱智 

    Flex3的ComboBox不能像HTML的Select一样,可以根据text或value直接设置选中值.还要我自己包个增强的ComboBox自定义组件

    在自定义组件里加入这样一个方法就可以有这个功能了

    public function selectedMyComboBoxLabel(_lable:String):void
    {
    	for each(var cmb:Object in this.dataProvider){
    		if(_lable == cmb.label){
    			this.selectedItem = cmb;
    			break;
    		}
    	}
    }

    调用很简单
    MyComboBoxId.selectedMyComboBoxLabel(“要选中的文本项”);

     
  • admin 3:27 pm on 2010年01月18日 Permalink | 登录留下评论  

    Flex给自定义组件设置方法和属性 

    本例使用ComboBox为原型. 做了一个可以根据用户设置的属性自动从HTTPService获取不同数据列表的自定义组件…

    HTTPService获取数据的PHP代码

     	if($_GET["action"]==="1")
    		echo "true";
     	else
     		echo "false";

    自定义组件代码

     
    <?xml version="1.0" encoding="utf-8"?>
    <mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml" editable="true" >
    	<mx:HTTPService id="hs" url="{this._hsUrl}" result="this.dataProvider=hs.lastResult.toString()"/>
     
    	<mx:Script>
    		<![CDATA[
    			[Bindable]
    			private var _hsUrl:String;
    			public function set hsUrl(v:String):void
    			{
    				this._hsUrl = v;
    			}
    			public function hsSent():void
    			{
    				hs.send()
    			}
    		]]>
    	</mx:Script>
    </mx:ComboBox>

    使用组件代码

     
    	<ns1:myCbb x="187" y="174" id="myCbb1"/>
    	<ns1:myCbb x="87" y="74" id="myCbb2"/>
    	<mx:Script>
    		<![CDATA[
    			private function init():void
    			{
    				this.myCbb1.hsUrl = "http://localhost:8081/index.php?action=1";
    				this.myCbb1.hsSent();
     
    				this.myCbb2.hsUrl = "http://localhost:8081/index.php?action=2";
    				this.myCbb2.hsSent();
    			}
    		]]>
    	</mx:Script>
     
  • admin 1:22 pm on 2010年01月15日 Permalink | 登录留下评论  

    flex httpservice vs Remote object 优点 

    1.RemoteObject要使用到AS的实体类(使用Bindable绑定Java类)。我的系统涉及到200多张表,如果改动表结构的话,AS实体类也要跟着改。十分麻烦,而且写好又要改getter,setter,又要部署到tomcat。除非你自己写工具自动生成。

    2.使用RemoteObject,那你的J2EE后台要添加remoting-config.xml,services-config.xml 等等的配置文件和Flex的lib,多了很多文件,而我做项目的Flex仅仅是客户端显示,然后调用后台。因此我的服务端完全就可以我们熟悉的J2EE需要用到的文件。减少了配置和以后的维护。

    3.如果你要使用到Spring的话,需要配置SpringFactory和destination。例如:
    services-config.xml里面添加:
    <factories>

         <factory id=”spring”/>

    </factories>
    remoting-config.xml里面添加:

    <destination id=”userService”>

    <properties>

    <!–    工厂对应你自己取的工厂名字     –>

            <factory>spring</factory>

    <!–    这个source对应spring的bean的id     –>

            <source>userService</source>

        </properties>

    </destination>
    这里需要为每一个Service配置,多的话。。。。

    4.我这边做Flex的UI的开发者都是应届毕业生,使用RemoteObject有必要了解ORM(我后台持久层框架是JPA),不然他们调 RemoteObject的方法时很容易出错,或者不会调用。而使用HttpService只需要我们后台人员和前台做UI的Flex开发者约定一套通信的xml格式即可。后台的负责返回xml,前台的负责发送xml,很爽!例如:
    <root>
    <model>
    <attribute1>attr1</attribute1>
    <attribute2>attr2</attribute2>
    </model>
    </root>

    5.Flex的组件对xml的支持十分友好。你可以直接将HttpService返回的xml放到组件的dataProvider就可以了,特别是dataGrid或者tree用起来特别好。

    6.使用HttpService减少了部署量。我只要将后台的Java程序部署到Tomcat,前台的Flex就可以直接将FlexBuilder编译好的程序在客户机连接后台,而不用部署到Tomcat,直接测试就可以了。大大提高了开发效率。

    7.使用HttpService也有缺点。首先就是通信的效率没有RemoteObject来的高(因为是xml,也可以使用JSON或者其它通信方式)。其次就是,你需要写Object与xml之间的转换。我没有使用xstream,而是自己用反射写工具类。你还需要提供Servlet给 Flex调用。我用的是SpringMVC提供的MulitiController对Flex提供Http服务。

    8.使用HttpService,我碰到了一些意想不到的事情。最呕血的是我提供get方法返回xml数据的时候,Flex总是显示旧的数据。解决方法是在你请求的Servlet地址添加一个参数(参数名随便起,我用random),而且请求的参数必须每一次都不一样(可以通过当前时间或者 UUID实现),例如:http://192.168.2.111:8080/UserController.do?servlet=getAll& random=sdfsdfs

     
c
compose new post
j
next post/next comment
k
previous post/previous comment
r
reply
e
edit
o
show/hide comments
t
go to top
l
go to login
h
show/hide help
esc
cancel