`
无明
  • 浏览: 37936 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ExtJS tree in rails

    博客分类:
  • ruby
阅读更多
今天发现ExtJS支持Prototype了(不喜欢在rails中混用prototype和yui),赶紧去下载一个,并试验了一下tree组件,感觉还不错,考虑以后就用ExtJS了。
闲话不说了,贴代码
schema.rb

ActiveRecord::Schema.define() do

  create_table "categories", :force => true do |t|
    t.column "id", :int
    t.column "parent_id", :int
    t.column "tree_id",   :int
    t.column "lft",       :int
    t.column "rgt",       :int
    
    t.column "name",      :string 
    t.column "description", :string
    
    t.column "created_at",:int
       
  end
   
   add_index :categories, :name, :unique  => true
    

end



接着是model:
class Category < ActiveRecord::Base
  acts_as_nested_set :scope => :tree_id
  
  def leaf?
    if self.rgt - self.lft == 1
      return true
    else
      return false
    end 
  end

end


这里用的是Nested_set存储树,所以只需计算节点的左右值是否连续来判断叶子节点。Nested_set查询比较好用,就是插入效率差,用于目录的存储比较合适,一般目录不会频繁更新。

然后是rhtml:
<html>
    <head>
        <title>r</title>

        <%= stylesheet_link_tag "../javascripts/ext/resources/css/ext-all.css" %>
        <%= javascript_include_tag "ext/adapter/prototype/prototype.js" %>
        <%= javascript_include_tag "ext/adapter/prototype/scriptaculous.js" %>
        <%= javascript_include_tag "ext/adapter/prototype/effects.js" %>
        <%= javascript_include_tag "ext/adapter/prototype/ext-prototype-adapter.js" %>
        <%= javascript_include_tag "ext/ext-all-debug.js" %>

    </head>	
    <body>	
       <%= javascript_include_tag "category_tree.js" %>
       <div id="tree-div" style="border:5px solid #99bbe8; overflow:hidden; width:130px;"></div>
   
    </body>
</html>

让页面加载时同时加载树组件,也就是那个category_tree.js:

Ext.onReady(function(){
    // shorthand
    var Tree = Ext.tree;
    
    var tree = new Tree.TreePanel('tree-div', {
        animate:true, 
        loader: new Tree.TreeLoader({dataUrl:'http://localhost:3000/admin/category/category_tree'}), //修改这里
        enableDD:true,
        containerScroll: true
    });

    // set the root node
    var root = new Tree.AsyncTreeNode({
        text: 'Ext JS',
        draggable:false,
        id:'source'
    });
    tree.setRootNode(root);


    // render the tree
    tree.render();
    root.expand();
});

这个是抄ExtJS的Demo,只是改了数据源。ExtJS需要接收JSON格式的数据,我们可以在actioncontroller中提供:
class Admin::CategoryController < ApplicationController

  def category_tree
    
    categories = Category.find_by_sql("select * from categories where parent_id is null") 
    
    data = get_tree(categories,nil)  
   
    render :text=>data.to_json, :layout=>false
    
  end 
  
  def get_tree(categories, parent)
     data = Array.new
     
     categories.each { |category|
       if !category.leaf?
         
         if data.empty?
           data =   [{"text"  =>  category.name,"id"  => category.id,"cls" => "folder" ,"leaf"  => false,
             "children" => get_tree(category.children,category) }] 
         else
           data.concat ([{"text"  =>  category.name,"id"  => category.id,"cls" => "folder" ,"leaf"  => false,
              "children" => get_tree(category.children,category)}])
        end
        
       else
         data.concat([{"text" => category.name,"id" => category.id,"cls" => "file","leaf" => true}]) 
       end
         
     }
     return data
     
  end
 
end


这段代码使用递归构造了一棵树,并转换成ExtJS需要的json数据返回页面。
好啦,这时用浏览器访问就能看到效果了.只是写了一点点代码,加上ExtJS,我们就有一个树型目录了,想起以前用java+xloadtree做树型目录的那个费劲啊,哎
分享到:
评论
13 楼 simon_lin 2007-09-13  
高!我也正想找这样的例子,可是我还是不会使用。
首先,如何配置安装 ExtJS?也就是我要参考这个例子的话,我如何在项目中做什么安装或配置?
其次,关于以上的例子,是否可以多加些这些代码在项目中的结构,也就是各个程序代码应该放在对应的什么文件夹下;

小弟初学,问得比较基础,请赐教!谢谢!
12 楼 yishh 2007-08-21  
有个问题,这种to_json的方式性能上会有多大的损失吗?
11 楼 sp42 2007-08-21  
jerry 写道
ExtJS支持UTF8吗?

没问题的
10 楼 jerry 2007-08-21  
ExtJS支持UTF8吗?
9 楼 无明 2007-05-22  
downpour 写道
我有个权限相关方面的问题

因为一般这样的树型结构中

role和这个树结构如何比较好的结合起来

我想问一下,这个tree_id 是不是为了做权限的,大致思路能不能讲一下

tree_id这个字段不是用来区分权限的,是better_nested_set的一个可选参数,用于标示单独一颗树。比如,水果类的目录树的tree_id是1,饮料类的目录树的tree_id是2。better_nested_set还是很好用的,增强了标准的act_as_nested_set,多了一些实用的方法,推荐在需要用到nested_set的场合使用。

安全问题我是这么考虑的,我并不希望把树做的很复杂,只把它当作一个单纯的表示组件。因此我会根据用户的权限,在actioncontroller中计算好需要显示的节点值再交给extjs去渲染。在category_tree.js中,我可以加一段代码:
tree.on('click', function(node){ 
	     handle_click(node.id,node.text)
	});

在引用这个js的rhtml中实现handle_click(node.id,node.text),通过ajax去执行相应的role,大概会是这样的形式:


<script>
	function handle_click(node_id,node_text){
		
		new Ajax.Updater('your-div', 'your-acrtion/'+node_id, {asynchronous:true, evalScripts:true}); return false;
		
	
	}
</script>

这样tree这边只是保存了一些关键参数,基本上所有的逻辑都是保留在action中

对于tree的构造么,我是不想做成ajax方式,一方面这类东西的数据量不会很大,另一方面,变化很少,还不如一次取出来,然后缓存起来。rails的运用缓存的方式还是很灵活和方便的
8 楼 sp42 2007-05-22  
http://www.ajaxjs.com/yuicn/article.asp?id=20070241可参考夜色兄写的一篇旧作,蛮实用的
7 楼 downpour 2007-05-22  
我有个权限相关方面的问题

因为一般这样的树型结构中

role和这个树结构如何比较好的结合起来

我想问一下,这个tree_id 是不是为了做权限的,大致思路能不能讲一下
6 楼 yier 2007-05-12  
非常感谢无明老大,这就看nested_set去,:)

tree已经显示出来了,原来是 js 里的 dataUrl:'http://localhost:3000/admin/category/category_tree' 的问题,奇怪的是我只是改为 dataUrl:'http://127.0.0.1:3000/admin/category/category_tree' 就好了,改为 dataUrl:'/admin/category/category_tree' 也行,不过为啥localhost不行就想不明白了,还得继续

p.s.

Ext-js的效果真是一流,虽然才看了两三天,已然决定下一个项目就用它了,希望无明老大能多写写这方面的教程,再次感谢感谢
5 楼 无明 2007-05-12  
这是我的疏漏,我用了一个nested_set增强插件,没在帖子里交代清楚,不好意思:thttp://opensource.symetrie.com/trac/better_nested_set/

那个children方法就是一个增强方法。

其实你看schema也应该能猜到这个children的作用,就是取节点的直接子节点,正常的nested_set是不需要parent_id的,现在这个模型是嵌套集合模型和邻接表模型的混合,这样取直接子节点就非常简单了,只需要一个类似 select * from tables where pid = self.id这样的查询就可以了

在rails中集成extjs现在是很简单的事情了,如果yier你能通过这个例子额外的理解嵌套集合模型和邻接表模型的作用和优缺点,我觉得收获会更大一点:)
4 楼 yier 2007-05-12  
又看了看,似乎和model里面的这个有关系:
 
acts_as_nested_set :scope => :tree_id  

改为:
 
acts_as_tree :Order => ‘tree_id‘

就没有
  undefined method `children'
的错误了,不过tree还是不出来,依然只有Ext Js 在那边不停的滚动着,再看看吧
3 楼 yier 2007-05-11  
ruby 坛子里的人好少  没有人来么

还是category.children的问题,总是报下面的错

NoMethodError in Admin/categoryController#categoryTree
undefined method `children' for #<Category:0x4a4bfd8>


还是没明白怎么作,哎
2 楼 yier 2007-05-11  
感谢 无明老大,学习中,
不过有两个问题还需无明老大帮忙看看:
1:ruby代码 里第17行 category.children 似乎在schema.rb里没有定义,没明白??
2:能否给几条数据看看,我加入库的数据总不对,希望无明老大帮人帮到底,再次感谢!!!
1 楼 sina2009 2007-05-04  
现在正需要这个
谢了

相关推荐

    动态加载extjs tree

    ExtJS Tree是Ext JS库中的一个组件,用于创建和展示层次结构的数据,通常表现为树形结构。这个组件在Web应用程序中广泛使用,特别是在需要管理有层级关系的数据时,如文件系统、组织架构或者导航菜单等。动态加载是...

    extjs tree 异步加载树型

    ExtJS Tree 是一个基于 ExtJS 框架的组件,用于构建可交互的、层级结构的树形控件。在 Web 开发中,它经常被用来展示目录结构、组织架构或者复杂的分类数据。异步加载树型是 ExtJS Tree 的一个重要特性,允许只在...

    ExtJs Tree

    根据给定的信息,我们可以深入探讨ExtJs中Tree组件的相关知识点,包括其定义、特性以及具体的配置选项等。 ### ExtJs Tree概述 ExtJs Tree是一种基于ExtJs框架的树形控件,它允许开发者构建出复杂的数据层次结构。...

    extjs tree示例

    ExtJS Tree 示例是一种基于ExtJS库实现的交互式树形组件,它允许用户在Web应用程序中展示层次结构数据。在本示例中,我们将探讨如何使用ExtJS来创建、访问和操作一个树形结构,特别是在数据库操作方面,如添加和删除...

    Extjs tree实例【源代码】

    ExtJs 2.2.1 tree实例,内附mysql数据文件 1. 数据节点一次性加载 2. 节点分为两个类(项目和设备) 3. 右键菜单 4. 节点增、删、改操作 ....... 后台是java struts1。 本例旨在说明extjs的tree操作,后台操作很简陋...

    Extjs Tree + JSON + Struts2 例子

    ExtJS Tree 需要的数据结构是一个 JSON 数组,每个元素代表树的一个节点。节点可以包含属性如 "cls"(样式类)、"id"(唯一标识)、"leaf"(是否为叶子节点)以及 "children"(子节点数组)。例如: ```javascript ...

    Extjs Tree + JSON + Struts2 示例源代码

    ExtJS Tree + JSON + Struts2 示例源代码是结合了三种技术来实现一个动态的、交互式的树形数据展示的应用。这个示例中,ExtJS用于前端UI的构建,JSON作为数据交换格式,而Struts2则作为后端MVC框架处理请求和返回...

    extjs的tree的使用

    在深入探讨ExtJS中Tree组件的使用之前,我们先来了解一下ExtJS本身。ExtJS是一个用JavaScript编写的开源前端框架,旨在帮助开发者构建复杂、高性能的Web应用程序。它提供了丰富的UI组件库,其中包括Tree(树形)组件...

    ExtJS Tree教程及例子代码

    ExtJS Tree是Sencha公司开发的ExtJS框架中的一个组件,用于构建可交互的树形数据结构。在网页应用中,树形结构常用于展示层级关系的数据,如目录结构、组织架构或者数据库的表关系。ExtJS Tree组件提供了丰富的功能...

    extjs tree 学习资料

    ExtJS Tree 是一个功能强大的JavaScript组件,用于在Web应用程序中创建和展示层次结构的数据,它在ExtJS框架中扮演着重要角色。这个压缩包“extjs tree 学习资料”显然是为那些希望深入理解并掌握ExtJS Tree组件的...

    带复选框的 ExtJs tree

    在给定的文件中,我们关注的是“带复选框的ExtJS tree”这一主题,这涉及到ExtJS框架下的树形组件(TreePanel)如何与复选框结合,为用户提供更为灵活的数据选择和管理方式。 ### 标题解析:“带复选框的ExtJS tree...

    extjs tree

    ExtJS Tree是基于ExtJS框架实现的一种数据结构展示方式,它主要用于展示层级关系的数据,例如组织结构、文件系统等。ExtJS是一个强大的JavaScript库,专为构建富客户端Web应用程序而设计,提供了丰富的组件化功能和...

    extjs-tree.zip_extjs tree

    ExtJS Tree是一个强大的JavaScript库,专门用于创建交互式的树形结构。这个"extjs-tree.zip"文件包含了使用Java编写的ExtJS异步树形控件的示例代码,旨在帮助开发者快速理解和应用这一功能。ExtJS是Sencha公司开发的...

    Extjs的tree

    ExtJS的Tree组件是Sencha ExtJS框架中的一个重要部分,用于构建可交互的树形结构数据展示。在ExtJS中,TreePanel是用来显示和操作树形数据的主要组件,它可以用于组织层次化的信息,如文件系统、组织架构或者分类...

    Extjs tree+grid+form+panel 使用实例

    Ext各种组件的使用实例,Extjs tree+grid+form+panel 使用实例

    ExtJs4 Checkbox tree

    ExtJs4 Checkbox Tree是基于ExtJs 4框架实现的一种特殊树形组件,它在传统的树形结构基础上增加了复选框功能。这种组件常用于需要用户多选树形数据的场景,比如权限设置、目录选择等。下面将详细介绍ExtJs4 Checkbox...

    extjs tree CHECKBOX 多选删除未实现(带SQL脚本)

    在网上下载别人的代码,改进加上CHECKBOX ,但是批量删除做不出来,希望高手完成并分享。

    Extjs Tree + JSON + Struts2

    ExtJS Tree + JSON + Struts2 是一个常见的前端与后端交互技术组合,常用于构建动态的、数据驱动的树形结构界面。在这个项目中,`index.html` 是主页面,`tree.js` 包含了 ExtJS 的树组件相关的 JavaScript 代码,`...

    extjs ajax tree(js动态树,无需递归)

    ExtJS AJAX Tree是一种基于JavaScript的动态树形结构,它利用AJAX技术来异步加载节点数据,无需在服务器端生成完整的树结构。这种方式可以显著提高页面加载速度,尤其是在处理大量数据时。ExtJS是一个功能丰富的...

    extjs tree 节点 链接 新窗口

    在ExtJS中,Tree是一个非常重要的组件,它用于呈现层级结构的数据。在处理Tree节点时,特别是涉及到链接和新窗口打开的情况,有一些特定的技术要点需要注意。 首先,标题“extjs tree 节点 链接 新窗口”指的是在...

Global site tag (gtag.js) - Google Analytics