2008年11月8日

Rails整合flex心得

@
由于项目的需要将页面全部转向flex,本来打算使用extjs,不过小试了一下出现挺多问题,主要是因为资源比较少,商业用的话也要钱,老师当时也催得比较急,最后还是决定采用adobe的flex,资源多,还有一本rails与flex整合的书可以参考,而且开源:)。最近接了个merb的项目,要使用到jquery,才发现这个框架也是很优秀的,正在努力学习ing...
最早接触flex是在今年深圳的Bea Java2SOA DEV2DEV大会上adobe的人展示flex效果,这个大会唯一的收获就是发现flex的用户体验做得很不错!
在XP使用flex builder 3(基于Eclipse开发)进行开发的,不过这个builder3要钱.......;rails则在unix下,这就导致一个问题,老是要把flex application 编译好了再传过来检验!:(真的是很XX! 不过unix可以使用Eclipse的flex插件,还没试过,应该差不了多少!感觉builder做得还行。很难想象如果flex没有Eclipse这种重量级编辑器提供的代码补全和生成,情况会有怎样!?

1.与Rails的数据交互
我在项目中使用的是E4X数据与Rails交互,方法可以去参考<Manning.Flexible.Rails.Flex.3.on.Rails.2.Jan.2008>不过只有英文版(希望有人能翻译)!一般的数据传输比较简单,但是遇到同时提交多个Model时构造这个XML也是挺麻烦下的:

ActionScript 3语言: 代码发芽网

var params:XML = <orderitems></orderitems>;

for(var i:uint = 0; i < items.length; i++){

params["orderitem"][i].appendChild(<l>{int(items[i].L)}</l>);

}



相反在Rails这边传送多个元素给Flex时可以这样:

Ruby语言: 代码发芽网

render :xml => [[{:total_pages => @patterns.total_pages.to_s}], @patterns]


传递变量时只能这样做[{:total_pages => @patterns.total_pages.to_s}],才能to_xml成功!
其时我们也可以使用JSON或者RubyAMF来传递,而且RubyAMF比E4X更快!

2.动态性
在Html中,我们可以使用ERB来动态生成html标签,Flex中我们就可以使用ActionScript3来动态生成或者显示Flex标签呢!最近看了Jquery,里面的方法真的写得很方便给我们调用;不知道AS3可不可以写成这样来调用:)

3.打印
项目中老师注重打印这个功能,查了下资料没什么难度;因为到时基本上是打印DataGrid里面的内容。不过好像Flex不支持打印预览,只能通过javascript来实现 orz...

4.XML在DataGrid的显示
一般我们都会显示Model关联的Model的属性,如果html中我们可以这样来调用@post.comment.first.body,但是在Flex中这样怎么办呢,因为传递过去的是XML数据,DataGrid不会这么聪明去帮你找到子对象的属性,我们可以这样做:

ActionScript 3语言: 代码发芽网

<mx:DataGridColumn headerText="material" width="50"

labelFunction="materialType">



然后再自己添加这样的一个方法来显示:

ActionScript 3语言: 代码发芽网

private function materialCategory(item:Object,colum:DataGridColumn):String{
return item.mcategory.name;
}

但是我发现这种方法只能显示两层嵌套对象的属性,超过二层嵌套就不行了,如上面:item.mcategory.material.name,返回不了material的名字,因为在Rails在的to_xml方法不支持嵌套子对象的子对象!
这种情况暂时也没有什么办法,我只能将要显示的属性全部add到Model中,也就是加冗余字段!而且这样也可以减少数据的传递,因为你在to_xml时include其它model时,也是将那个model的全部属性传递过去,不过显示时有挺多字段用不上!

5.字符问题
发现在Ubuntu 8.04,Firefox 3.0.3下面,utf 8编码的Flex Application中输入中文会乱码,但是XP下无论FF3还是IE都没有问题!这个也让我很费解下!

6.Flex
Flex的话主要还是要理解事件和绑定,理解这二个的话,后面的就比较容易!还有states,在控件的转换显示中也挺常用到!如果项目比较大的话可以考虑使用Cairngorm这个框架!
Flex.3.CookBookThe.Essential.Guide.to.Flex.3这两本书也不错下!Live doc也很常去查!
 

Reading

Read