ExtJs開發教程_002_如何使用ExtJs中的Ext.data.TreeStore


介紹Ext.data.TreeStore:

 

這個組件繼承自Ext.data.AbstractStore

本篇講解了如何構造並且做一些基本使用,如果有什么疑問可以聯系我QQ1330771552

首先還是介紹下這個控件內部屬性。對每一個屬性做一下分析。

autoLoad:
    自動加載,實際上你會發現在Ext4.X中這個屬性沒有多少意義,后面會做解釋。
autoSync:
    自動同步,比如我們用普通editingGrid的時候,修改了數據自動保存到store(不是保存到后台)
clearOnLoad:
    在加載之前刪除原來的所有子節點,可能在4.X中都會遇到tree第二次加載的時候數據重復,造成混亂,你可以試試這個屬性。
clearRemovedOnLoad:
    你加載一個節點的時候,會自動把已經刪除的節點記錄清除,可以參考getRemovedRecords() 函數
defaultRootId:
    默認的根節點(root)id,這個是在異步加載樹種很重要的,就是展開根節點的時候向后台發送請求的參數(稍后講解)
defaultRootProperty:
    子節點的屬性名,用處不大。就是修改什么屬性作為子節點解析用的。
fields:
    屬性域,跟Ext.data.Store的fields一樣使用。
filters:
    過濾器。
folderSort:
    排序,設置為true自動為子節點排序
listeners:
    監聽器。定義觸發事件。
model:
    跟Ext.data.Store的model一樣。
nodeParam:
    節點參數,注意這個是參數名,defaultRootId是參數值。
proxy:
    數據代理。這個跟Ext.data.Store一樣。
root:
    根節點,ExtJs的樹允許你設置一個默認的根節點,也就是說不加載數據的情況下會顯示這個作為基礎的節點。通常我們使用這個節點代替treePanel的title。用來標示這棵樹的目的。
storeId:store的唯一性標示,便於Ext.data.StoreManager管理,可以參看Ext.data.StoreManager. lookup( String/Object store ) : Ext.data.Store

說實話,這些屬性有的我也沒用過,太多了,記不過來。

下面給出一棵樹的完整代碼

var oaStore = Ext.create('Ext.data.TreeStore', {
                // 根節點的參數是parentId
                nodeParam : 'parentId',
                // 根節點的參數值是0
                defaultRootId : 0,
                // 屬性域
                fields : [{
                            name : 'className',
                            type : 'string'
                        }, {
                            name : 'text',
                            type : 'string'
                        }, {
                            name : 'iconCls',
                            type : 'string'
                        }],
                // 數據代理
                proxy : {
                    // 請求方式
                    type : 'ajax',
                    // 請求網址
                    url : GET_FUNCTION_NODE_URL
                }
            });

上面是一棵樹的代碼,下面是分析代碼

nodeParam : 'parentId',就是指定這棵樹的根節點屬性參數名。

defaultRootId : 0,就是制定這棵樹的根節點參數值。

 

Ext.data.TreeStore默認是每個節點都帶有id屬性的。比如如下json

{id:’1’,className:’Ext.le.MyView’,text:’我的視圖’,iconCls:’icon_depart’}

這個json是能解析到id屬性的,你獲取了store某條record直接.get(‘id’)就會有值。就是1

 

ExtJs的tree在點擊可以展開的節點的時候,會向后台發送請求,請求的url就是proxy里面的url,同時還會帶上參數參數就是當前點擊節點的id(就是上面說的id)。

注意:當然Ext很智能,當你的樹的某個節點已經有子節點了的情況下,他不會去發送請求獲取子節點的。

事實上剛才的store在我的項目里面讀取了這樣一個json結構

  [{

           "children" : [{...}, {...}],
           "className" : "","expandable" : true,
           "expanded" : false,
           "functionNodeName" : "人事管理",
           "iconCls" : "",
           "id" : 1,
           "leaf" : false,
           "memo" : "","parentId" : 0,
           "primaryKey" : 1,
           "text" : "人事管理"

       }]

其中的expandable就是控制這個節點可以展開的。有了他節點就會可以展開(也就是有效箭頭或者“+”圖標在旁邊),並且會發送請求子節點。

想想,后台能獲取當前點擊的那個節點的id,想得到子節點很容易了,

注意:expandable屬性和children屬性有這樣的沖突,當children屬性是array([])長度是0的時候,expandable被視為false,也就是說記載的數據有0個children就認為不可以展開

select * from department where parentId=````````聰明的你懂的。

這樣就能構成異步樹。

這棵樹如何被應用到panel中呢

事實上你只需要這樣的代碼就能完成。

              {
                            title : '模塊菜單',
                            xtype : 'treepanel',
                            rootVisible : false,
                            store : oaStore,
                            useArrows : true
                        }

  看看,是不是很簡單,一個標題,一個xtype,rootVisible屬性控制能不能看到根節點,關於這個屬性,其實就是控制是否顯示你默認的那個根節點,其實如果你的根節點expanded屬性(是否已經展開)是false然后treePanel rootVisible是false那么你的樹在頁面渲染完成的時候是什么也看不到的。而且你可能無法看到,至少你應該允許看到根節點,然后打開根節點才能看到下面的內容,或者你的根節點隱藏,默認根節點已經展開。

  剛才的treePanel是個不完整的例子,是json格式的,下面給出Ext.create格式

  不要誤會,這個跟上面的store沒有任何關系

    var deptGrid = Ext.create('Ext.tree.Panel', {
            store : deptStore,
            useArrows : true,//展開按鈕圖標是箭頭還是+-
            rootVisible : true,//允許看到跟節點
            columns : deptColumns(),//構造列
            tbar : deptTbar,//不解釋
            padding : 5,//不解釋
            columnLines : true,//列分割線
        });

這是一個非常基礎的列子,還帶了一些沒用的屬性,不解釋的就是么哦用的屬性,可有可無包括columns

如果你不寫columns會默認使用text、id等這些默認屬性,詳細可以參看Ext.data.NodeInterface和Ext.tree.Panel后續章節會講解這些相關控件。

這棵樹能做到什么效果呢?

很簡單,默認記載好的樹,只呈現最基本的節點,當你點擊可展開的節點的時候會去請求后台加載其子節點,發送的url大致如下

下面是googleChrome中netWork監控得到的請求,這個請求攔截於我展開一個節點的時候發生的。

  1. 1.     Request URL:

http://localhost:8080/struts2Stu/FunctionNodeController/selAllFunction.action?_dc=1344480677744&parentId=1

  1. 2.     Request Method:

GET

  1. 3.     Status Code:

200 OK

 

  1. 1.     Query String Parameters
    1. 1.     _dc:

1344480677744

  1. 2.     parentId: (看到這個屬性沒有,就是我們自己定義的nodeParam

1

注意這個url

http://localhost:8080/struts2Stu/FunctionNodeController/selAllFunction.action?_dc=1344480677744&parentId=1

 

http://localhost:8080/struts2Stu/FunctionNodeController/selAllFunction.action到這里是我的后台地址。

后面的_dc=1344480677744是用來做唯一標示不造成緩存。

parentId=1 這個就是Ext幫助我們構造異步加載樹的參數。

至於如何不異步加載,你可以直接把json構造好樹的樣子,子節點使用children標示.

給出一個同步加載的json例子

[{
            "children" : [{
                        "children" : [{
                                    "children" : [],
                                    "companyName" : "123asd",
                                    "deleter" : 0,
                                    "departmentName" : "123asds",
                                    "duty" : "sa",
                                    "expandable" : true,
                                    "expanded" : false,
                                    "id" : 4,
                                    "leader" : 1,
                                    "leaf" : true,
                                    "memo" : "ad",
                                    "primaryKey" : 4,
                                    "text" : "123asds"
                                }, {
                                    "children" : [],
                                    "companyName" : "愛上",
                                    "departmentName" : "愛上",
                                    "duty" : "阿斯達",
                                    "expandable" : true,
                                    "expanded" : false,
                                    "id" : 3,
                                    "leader" : 1,
                                    "leaf" : true,
                                    "memo" : "阿斯達",
                                    "parentId" : 2,
                                    "primaryKey" : 3,
                                    "text" : "愛上"
                                }],
                        "companyName" : "葉子公司",
                        "departmentName" : "大陸分公司",
                        "duty" : "沒職位",
                        "expandable" : true,
                        "expanded" : false,
                        "id" : 2,
                        "leader" : 1,
                        "leaf" : false,
                        "memo" : "沒有",
                        "primaryKey" : 2,
                        "text" : "大陸分公司"
                    }],
            "companyName" : "葉子集團",
            "deleter" : 0,
            "departmentName" : "大陸總公司",
            "duty" : "總職務",
            "expandable" : true,
            "expanded" : false,
            "id" : 1,
            "leader" : 1,
            "leaderName" : "",
            "leaf" : false,
            "memo" : "沒有備注",
            "primaryKey" : 1,
            "text" : "大陸總公司"
        }]

這樣結構是json會直接呈現所有的節點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM