`
艾建锋
  • 浏览: 24491 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

extjs 扩展树,带复选框,能联动

阅读更多

功能说明:1 菜单为后台读取数据,异步加载生成。
2 菜单后边的功能列表为读取数据库生成。
3 当选中菜单时候可以级联选中 其后边的所有功能。
4 当选中功能时候,若功能对应的菜单未选中,则自动选中菜单。
5 非叶子节点也可以设置显示复选框,这样的例子网上有。
不知道大家对这颗树感觉如何?
  • 大小: 18.8 KB
分享到:
评论
9 楼 cnwong 2010-09-08  
不错的文章,
8 楼 艾建锋 2010-08-25  
kidiaoer 写道
你好,请我能讲解一下你的这个系统里面的权限是怎么实现的吗?如果不介意的话,能不能给提供源码供我参考一下。那样的话我将万分感激。如果不方便的话,那就算了。

1权限跟用户的角色关联,跟用户的角色组关联。or的关系。
2每个菜单的下面的功能,可以自定义(存取到数据库)。每个功能在界面上会对应一个按钮。按钮初始化为hide,当用户用这儿功能的时候,则show。权限控制可以写个js。对于有权限控制的页面,只需要导入这个js。调研里面的函数即可。
7 楼 艾建锋 2010-08-25  
fooky 写道
很不错,做权限管理很好,异步加载菜单数据和其后面的从数据库读取的功能点同时显示这个创意不错。我想知道怎么实现的

1后台读取数据库,这部分自己搞定。2你要分析以前贴过的那两个js文件
6 楼 kidiaoer 2010-08-24  
你好,请我能讲解一下你的这个系统里面的权限是怎么实现的吗?如果不介意的话,能不能给提供源码供我参考一下。那样的话我将万分感激。如果不方便的话,那就算了。
5 楼 fooky 2010-07-19  
很不错,做权限管理很好,异步加载菜单数据和其后面的从数据库读取的功能点同时显示这个创意不错。我想知道怎么实现的
4 楼 艾建锋 2009-09-15  
yehuijia 写道
你好!
   最近也在研究用EXTJS做权限管理模块,
   看到你的界面,比较吻合我现在的需求,
   如果楼主有时间,能否针对这块内容做点补充!
   上传点可具参考性的JS代码,可以否!
   感谢!
  

Ext.tree.TreeCheckNodeUI = function() {
// 'multiple':多选; 'single':单选; 'cascade':级联多选
this.checkModel = 'multiple';

// only leaf can checked
this.onlyLeafCheckable = false;

Ext.tree.TreeCheckNodeUI.superclass.constructor.apply(this, arguments);
};


Ext
.extend(Ext.tree.TreeCheckNodeUI, Ext.tree.TreeNodeUI, {

renderElements : function(n, a, targetNode, bulkRender) {
var tree = n.getOwnerTree();
this.checkModel = tree.checkModel || this.checkModel;
this.onlyLeafCheckable = tree.onlyLeafCheckable || false;

// add some indent caching, this helps performance when
// rendering a large tree
this.indentMarkup = n.parentNode ? n.parentNode.ui
.getChildIndent() : '';
var href = a.href ? a.href : Ext.isGecko ? "" : "#";

//var cb = (!this.onlyLeafCheckable || a.leaf);

// //////////////////////////////////////////////////
var cb = a.leaf;// 作用是当节点为叶子节点的时候显示复选框,其他时候不显示
var resourcesStr = "";// 子菜单下面的权限
//alert("11"+n.attributes.resources+"22");
if (n.attributes.resources != "") {
// 子菜单下面的权限store
var resourcesStroe = new Ext.data.SimpleStore( {
data : eval(n.attributes.resources),
fields : ["id", "name", "checked"]
});
for (var i = 0;i < resourcesStroe.getCount(); i++) {
var record = resourcesStroe.getAt(i);
resourcesStr += "<input class='x-tree-node-cb' onclick=resCheckChange(this,'"+n.id+"') name=res"
+ n.id
+ " id = '"
+ record.get("id") + "' type='checkbox' ";
if (record.get("checked")) {
resourcesStr += "checked=true/>"
+ record.get("name");
} else {
resourcesStr += "/>" + record.get("name");
}
}
}
// alert(resourcesStr)

var buf = [
'<li class="x-tree-node"><div ext:tree-node-id="',
n.id,
'" class="x-tree-node-el x-tree-node-leaf x-unselectable ',
a.cls,
'" unselectable="on">',
'<span class="x-tree-node-indent">',
this.indentMarkup,
"</span>",
'<img src="',
this.emptyIcon,
'" class="x-tree-ec-icon x-tree-elbow" />',
'<img src="',
a.icon || this.emptyIcon,
'" class="x-tree-node-icon',
(a.icon ? " x-tree-node-inline-icon" : ""),
(a.iconCls ? " " + a.iconCls : ""),
'" unselectable="on" />',
cb
? ('<input class="x-tree-node-cb" type="checkbox" name="'+n.id+'" ' + (a.checked
? 'checked="checked" />'
: '/>'))
: '',
'<a hidefocus="on" class="x-tree-node-anchor" href="',
href,
'" tabIndex="1" ',
a.hrefTarget ? ' target="' + a.hrefTarget + '"' : "",
'><span unselectable="on">',
n.text,
"</span></a><div style='display:inline; position:absolute;left:180px'>"
+ resourcesStr + "</div></div>",
'<ul class="x-tree-node-ct" style="display:none;"></ul>',
"</li>"].join('');

var nel;
if (bulkRender !== true && n.nextSibling
&& (nel = n.nextSibling.ui.getEl())) {
this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel,
buf);
} else {
this.wrap = Ext.DomHelper.insertHtml("beforeEnd",
targetNode, buf);
}

this.elNode = this.wrap.childNodes[0];
this.ctNode = this.wrap.childNodes[1];
var cs = this.elNode.childNodes;
this.indentNode = cs[0];
this.ecNode = cs[1];
this.iconNode = cs[2];
var index = 3;
if (cb) {
this.checkbox = cs[3];
Ext.fly(this.checkbox).on('click',
this.check.createDelegate(this, [null]));
index++;
}
this.anchor = cs[index];
this.textNode = cs[index].firstChild;
},

// private
check : function(checked) {
var n = this.node;
if (checked === null) {
checked = this.checkbox.checked;
} else {
this.checkbox.checked = checked;
}
// 自定义,当选中叶子节点的时候,其后面的资源checkbox全都选中
var allChecks = Ext.getDoc().dom.getElementsByTagName("input");
for(var i = 0;i < allChecks.length;i ++){
var check = allChecks[i];
if(check.name == "res"+n.id){
check.checked = checked;
}
}
n.attributes.checked = checked;
//tree.fireEvent('check', n, checked);
}
});

/**
* 资源复选框,选择改变事件.
* 当选中资源的时候,子菜单选中。
*/
function resCheckChange(obj,nodeId){
var allChecks = Ext.getDoc().dom.getElementsByTagName("input");
if(obj.checked){
for(var i = 0;i < allChecks.length;i ++){
var check = allChecks[i];
if(check.name == nodeId && !check.checked){
check.checked = true;
var node = Ext.getCmp("tree").getNodeById(nodeId);
node.attributes.checked = obj.checked;
}
}
}
}
3 楼 艾建锋 2009-09-15  
yehuijia 写道
你好!
   最近也在研究用EXTJS做权限管理模块,
   看到你的界面,比较吻合我现在的需求,
   如果楼主有时间,能否针对这块内容做点补充!
   上传点可具参考性的JS代码,可以否!
   感谢!
  

var roleId = "";
/**
* 生成角色分配权限的窗口
*/
function _resourcesRoleMge(row){
roleId = row.get("pk");

/**
* 左侧的菜单树
*/
var treeConfig = {
region : "center",
id:"tree",
collapsible : true,
border : false,
layout:"fit",// 自动填充
height:300,
width:200,
autoScroll :true,
frame:true,
enableDrag : false,
checkModel : 'cascade', // 对树的级联多选
onlyLeafCheckable : false, // 对树所有结点都可选
rootVisible : true, // 显示根节点
animate : true, // 有一种动态效果
enableDD : false,// true to enable drag and drop是否支持拖拽效果
loader : new Ext.tree.TreeLoader( {
// 请求的地址
url : basePath + "admin/resourcesrolemge.do",
baseParams :{key:"list",roleId:roleId},
baseAttrs : {
uiProvider : Ext.tree.TreeCheckNodeUI
},
listeners:{// 加载前变化参数
"beforeload":function(treeLoader, node) {
        this.baseParams.roleId = roleId;
}
}
}),
root : new Ext.tree.AsyncTreeNode( {
id : "00",
text : "菜单资源",
icon : basePath + "images/menuimages/totalMenu.png"
})
};
var tree = new Ext.tree.TreePanel(treeConfig);

var windowconfig = {
title : "给角色【"+row.get("wtroleName")+"】分配权限",
width : 500,
//autoHeight:true,
height : 400,
id : 'iwindow',
modal : true,
autoScroll : true,
layout : "fit",
items : [tree],
buttonAlign:"center",
buttons:[{
text:"提交",
handler:_subRoleRights
},{
text:"关闭",
style:"margin-left:15px;",
handler:function(){
Ext.getCmp("iwindow").close();
}
}]
}
var iwindow = new Ext.Window(windowconfig);
iwindow.show();
tree.expandAll();// 展开所有节点
}




// 定义一个store
var resourcesStore=new Ext.data.Store({
url:basePath+"admin/resources.do?key=list",
reader: new Ext.data.JsonReader({
totalProperty : 'results',
remoteSort : false,// 是否后台排序,会提交两个参数sort和dir
root : 'rows'
},[{
name:"wtresourceId"
},{
name:"wtresName"
},{
name:"wtresDescription"
}]
)
});

/**
* 获取数据并保存
* 获得的数据有  roleId
* 所有选中的子菜单的id
* 所有选中的资源id
*/
function _subRoleRights(){
    // 所有选中的子菜单的id
var checkedNodesIds = "";// 选中的节点id
var checkedNodes = Ext.getCmp("tree").getChecked();
for (var i = checkedNodes.length - 1 ;i >= 0 ; i--) {
var node = checkedNodes[i];
if (node.leaf) {// 去掉非叶子节点
checkedNodesIds += "," + node.id;
}
if(i == 0){
checkedNodesIds = checkedNodesIds.substring(1);
}
}
// 获得所有选中的资源id
var checkedResourcesIds = "";
// 这里利用dom
var checkedResources = document.getElementsByTagName('input');
// 移除未选中的
for(var i = checkedResources.length - 1 ;i >=0 ;i --){
var checkbox = checkedResources[i];
if(checkbox.type == "checkbox" &&
checkbox.checked){
checkedResourcesIds += "," + checkbox.id
}
if(i == 0){
checkedResourcesIds = checkedResourcesIds.substring(1);
}
}
// 提交数据后台
_saveData(roleId,checkedNodesIds,checkedResourcesIds);
}


/**
* 保存数据
*/
function _saveData(roleId,checkedNodesIds,checkedResourcesIds){
Ext.Ajax.request( {
url : basePath + "admin/resourcesrolemge.do?key=add",
params:{roleId:roleId,checkedNodesIds:checkedNodesIds,checkedResourcesIds:checkedResourcesIds},
method:"post",
success : function(response) {
Ext.MessageBox.alert(infoText, response.responseText);
Ext.getCmp("iwindow").destroy();
},
failure : function(response) {
Ext.MessageBox.alert(errorText,response.responseText);
}
});
}




2 楼 yehuijia 2009-09-02  
你好!
   最近也在研究用EXTJS做权限管理模块,
   看到你的界面,比较吻合我现在的需求,
   如果楼主有时间,能否针对这块内容做点补充!
   上传点可具参考性的JS代码,可以否!
   感谢!
  
1 楼 yehuijia 2009-09-02  
你好!
   
    最近一个项目正急着要做权限管理,
    项目页面部分用的是EXTJS的,在网上看到你的这篇文章,

相关推荐

    带复选框的 ExtJs tree

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

    extjs带复选框的树包括全选 反选 子选父以及 父选子

    - `extjs复选框树.js`:这是实现上述功能的JavaScript代码,包括工具类和针对树节点的操作方法。 - `样式文件.css`:可能包含了一些自定义的样式,用于美化复选框和树的显示效果。 - `示例HTML文件.html`:演示如何...

    解决Extjs当中复选框全选后,取消选中某一项,全选框仍是选中状态的问题

    全选功能通常通过添加一个特殊的复选框来实现,该复选框与所有其他复选框的状态联动,当所有项被选中时,全选复选框自动选中;反之,当至少有一项未被选中时,全选复选框应该变为未选中状态。 问题的根源在于事件...

    extjs3.X 带复选框的树

    "带复选框的树"是ExtJS中的TreePanel组件的一个扩展,允许用户通过复选框选择树结构中的节点。这种功能在数据层级结构的管理和筛选中非常有用,例如在组织架构、文件系统或者权限设置中。 复选框树的核心在于`...

    基于EXTjs 的 动态复选框树

    基于EXTjs 的 动态复选框树 json数据交互

    extjs4.1下拉复选框完整DEMO

    在这个DEMO中,下拉复选框的实现可能就包含在ux目录下的某个文件中,它扩展了ExtJS的基础功能,提供了下拉复选框的特定行为和样式。 3. **resources** 目录:这个目录包含了ExtJS应用所需的各种资源,如CSS样式文件...

    Extjs4.2带复选框下拉树组件

    网上搜索了许久未找到...Extjs4.2 带复选框的下拉树,解决了向下勾选子节点、向上勾选父节点,正选反选获取值等问题,勾选的节点显示displayfield值直接显示在下拉文本框中。需要引用ext-all.js和ext-all-neptune.css

    extjs4带全选复选框的下列表(有bug)

    1、解压,进入extjs4.2.1\examples\form,浏览器打开 hbox-form.html 文件,当我勾选中任意一个多选下拉框,然后再勾选‘ALL’时,‘ALL’却是不被选中的状态,且...extjs4.2.1\examples\form\MultipleComboBox.js

    EXTJS动态树支持checkbox 全选

    标题中的“EXTJS动态树支持checkbox全选”指的是EXTJS中树组件的一个特性,即在树形结构中添加复选框(checkbox)功能,并支持全选和全取消选中操作。这样的功能对于需要用户进行多项选择的场景非常有用,比如文件...

    extjs表格(表格后台数据读,分页),树(后台数据读取,复选框联动)的基本操作示例

    在这个示例中,我们关注的是ExtJS中的两个关键组件:GridPanel和TreePanel,以及它们如何与后台数据进行交互,实现分页和复选框联动功能。 1. **GridPanel**:GridPanel是ExtJS中用于展示表格数据的组件,它提供了...

    Extjs改变树节点的勾选状态点击按钮将复选框去掉

    在树形控件中,节点的勾选状态通常通过复选框来表现,这个状态可以反映出用户对节点的选择情况。 在一些业务场景中,可能需要动态地改变树节点的勾选状态。例如,可能会有一个按钮的功能是清空树节点的勾选状态,...

    Extjs3.4.0版本 多选下拉框效果支持多选/全选/全不选

    这个功能增强了标准的单选下拉框,允许用户同时选择多个条目,通常通过复选框实现。在描述中提到的“全选/全不选”功能,是多选下拉框的一种高级特性,它提供了快速选择或取消所有选项的便利。 首先,我们来看看`...

    ext复选框的ColumnTree扩展包

    总的来说,"ext复选框的ColumnTree扩展包"为EXT的ColumnTree组件提供了增强的功能,使得在树形数据结构中进行选择操作变得更加便捷。通过引入这个扩展,开发者可以快速地为自己的EXT应用增加复选框功能,提高用户...

    带复选框的异步动态树

    "带复选框的异步动态树"是一个典型的前端开发案例,它涉及到EXTJS框架的使用,以及与MySQL数据库的交互。EXTJS是一个强大的JavaScript库,用于创建富客户端应用,其组件化的设计使得开发复杂的UI变得更为简单。下面...

    弹出层弹出层复选框

    提问 - Boxy.ask() - 用户定义的选项,选择项传递给回调函数 弹出 - Boxy.alert() - 回调函数总是不被调用 确认 - Boxy.confirm() - 仅当用户选择了“确认”时回调函数会被调用 行业选择器 - Boxy.industry() - 仅当...

    无废话ExtJs 系统教程十九[动态复选框:RemoteCheckboxGroup]

    在本教程中,我们将深入探讨ExtJS中的"RemoteCheckboxGroup",这是一个用于处理远程数据源的动态复选框组件。这个组件通常用于显示从服务器获取的动态选项,它允许用户根据需要选择或取消选择多个选项,同时将这些...

    ext4实现带复选框的多选下拉框

    "ext4实现带复选框的多选下拉框"这个主题聚焦于如何在EXTJS 4框架中构建一个功能丰富的UI组件,它允许用户通过复选框进行多选操作,提升用户体验。EXTJS是一个流行的JavaScript库,提供了丰富的组件库来构建复杂的...

    EXTJS扩展例子集

    每个组件都可能带有源代码,这对于我们理解EXTJS组件的实现机制和扩展方法非常有价值。 EXTJS3.0中的扩展通常包括以下部分: 1. **新组件**:开发者可能会创建全新的UI元素,比如一个高级的表格组件,具备更丰富的...

    Extjs 轻松实现下拉框联动

    最近小弟做了Extjs实现实现下拉框联动的效果,参考了好久才学会,闲下来发一个简单的例子。。呵呵

Global site tag (gtag.js) - Google Analytics