最近初学ext,自己javascript也是个半吊子,所以有很多地方不是太明白,希望哪高手能帮忙解答下,万分感激~~~1,extjs怎么很好的和一般的mvc框架集成?比如我用struts2,页面用freeer。在显示一个列表的时候,难道还要在ftl里面重新把数据一个一个封装成javascript的数组,再传给ext datagrid?有没有什么比较好的办法呢。2,extjs里面所谓的状态到底是什么意思?比如我有个可展开的菜单栏,用户选择了其中一个,当页面跳转或用户刷新后,菜单栏仍然显示在用户上次选择的那个,这个就是所谓的state?那么这个state该如何记录呢?3,每个页面都要通过Ext.onReady来创建一些组件,那么在页面跳转的时候,这些组件会不会缓存呢?比如layout,或者所有页面都公用的panel,不会是每一次页面跳转后都会新建吧。如果是的话,怎样做才比较适合多页面共享相同组件呢。4,div的问题,我发现如果div中有文本信息,然后再利用ext来使用这个div的话,在页面刚刚加载而ext还没有初始化完的时候,div里面的内容会全部以最原始的格式显示出来。虽然是一闪就过,但是还是不太美观。不知道它那个页面加载的效果是怎么做出来的。我看了下example的代码,发现它只是定了一个时间:
var hideMask = function () {
        Ext.get('loading').remove();
        Ext.fly('loading-mask').fadeOut({
            remove:true,
            callback : firebugWarning
        });
    }    hideMask.defer(250);
有没有什么更好的办法能做到呢?问题比较多,实在不好意思。所以多给点分,望高手指点一下。

解决方案 »

  1.   

    1: 既然用了ext, 那么数据传输用ajax是肯定的, 否则没有任何优势。 所以最后发送给ext的数据无非就是json,或者xml. 没有用过freeer,
    以struts1为例,也面有一个grid, 那么这个grid的store的proxy的url对应着后台struts的一个action, 比如:http://localhost:8080/MyProj/getAllStudents.do, 那么在后台getAllStudents.do这个url对应的action里面,取数据,然后把数据拼成xml或者json, 然后调用response.getWriter().write() 写到客户端就可以了。从前抬走到后台, 然后数据从后台回到前台全部过程就是这样,和普通的ajax,一样,不存在集成难的问题。 至于你说“在ftl里面重新把数据一个一个封装成javascript的数组, 这个过程是肯定要的, 因为你换了一种数据交换方式。我以前是这样做的, 对每个pojo,都给它一个方法,叫做toJSONString();或者toXMLString();这样的话你在action里面写数据的时候就简单很多了, 
    2:这个问题我没有做过, 不过我觉得不是难事,后台在session里存放用户选中的一些面板或菜单,或者这些信息放到cookie里面, 然后前台每次onReady函数执行完了以后, 检查一下这些状态,然后调用js恢复到用户刷新以前的状态。
    3:理论上讲,肯定不会缓存这些组建, 因为他们是客户端的东西。以刷新就没了。但是你有没有发现,用ext做出来的东西整个就像一个桌面应用程序, 所以整个页面跳转肯定是不推荐的。别忘了ext是一个ajax框架,要用ajax的优点。
    4:例子里面的div以及div里面的文字都是不必要的。可以根本不用他们。以examples/grid/array-grid.js为例,最后一行:grid.render('grid-example'); 你完全可以不render到那个div, 直接可以这样:grid.render(document.body);
      

  2.   

    感谢sunxing007的回答。我想再请教一下:1,第一个问题,我想再寻找一个比较好的方法,或者已有的插件之类的,应为我不打算把整个系统都做成异步调用。
    2,第四个问题,我说的情况是,如果页面上有多个div,而且每个div里面都有一大堆内容,那么再render进去的话,貌似就会出现那种情况。当然也可以让div为空,所有内容都在exj加载后在render进去,但是这样会不会不是那么好看呢实在是感激不尽啊~~~
      

  3.   

    其实我也只是自己私下用ext做过一个中型的系统. 很多大家面临的问题我都没有遇到过或者说已经忘记当初是怎么解决的了。
    所以我也不知道有什么插件, 推测可以用iframe, 就是说一些面板的内容要是比较固定,那么就直接和一个页面关联,Ext.onReady(function(){
    //我直接拿ext/examples/panel/panels.js作例子
        var p = new Ext.Panel({
            title: 'My Panel',
            collapsible:true,
            renderTo: 'some-div',
            width:400,
            html: '<iframe src="getStudentDetail.do" height=200px width=100%/>'
        });
    });上面的这个panel将固定和getStudentDetail.do关联,getStudentDetail.do可能对应着一个jsp.....
    上面的panel放到整个layout也是可行的, 因为layout的所有面板的构造函数都可以接受一个html参数。第4个问题:那就看实际的需求了,用户觉得妥善就行。
      

  4.   


    iframe,这个办法不错,每个panel对应一个单独请求,加载一个单独页面。太感谢了~~~~我总结了一下自己的思路,得出一个貌似可行的解决方法。尽量不做页面跳转,即使跳转了也尽量不从服务器端直接返回数据。给页面上所有需要加载数据的地方都单独写action请求,并直接返回json,再用ext一个一个初始化需要加载的对象。不知道这样做的话合不合适。不过如果这样做的话,我感觉还不如用flex+blazeDS或者zk,基本上可以和spring无缝集成,调后台还方便点。哎,我真的怕了js啊.... 囧
      

  5.   

    关键是ext比较庞大,很多地方不稳定。国内资料太少!