<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-124  評(píng)論-194  文章-0  trackbacks-0

    dojo提供了不錯(cuò)的樹(shù)控件,但上下文菜單比較簡(jiǎn)單,不能動(dòng)態(tài)改變:比如我想根據(jù)不同節(jié)點(diǎn)顯示不同的上下文菜單就比較困難,根據(jù)多種實(shí)驗(yàn)和查閱下面提供一種實(shí)現(xiàn)方式。在此過(guò)程中也學(xué)到不少東西。先把解決方案說(shuō)一下,再把發(fā)現(xiàn)過(guò)程說(shuō)一下:

    DOJO提供了AOP的方式來(lái)“注入”代碼,我們就把修改menu的代碼注入到TreeContextMenuV3里就可以了:
    在open事件前注入我們的代碼:

    dojo.event.connect("before", dojo.widget.byId("contextMenu1"), "open"this"onContextMenuOpen");

    注意before是表示在menu打開(kāi)之前調(diào)用,其它關(guān)鍵字還可以是after,around。強(qiáng),贊一個(gè)!

    在onContextMenuOpen函數(shù)中,做改變菜單的事情:

        this.onContextMenuOpen = function (evt) {
            dojo.log.info (
    "before context open");
            dojo.log.info (evt);
            
    var m = dojo.widget.byId("contextMenu1");
            dojo.log.info (m);
            m.removeChild (dojo.widget.byId(
    "treeContextMenuEdit"));
            m.removeChild (dojo.widget.byId(
    "treeContextMenuDown"));
            m.removeChild (dojo.widget.byId(
    "treeContextMenuCreate"));
            m.removeChild (dojo.widget.byId(
    "treeContextMenuCreate2"));

            
    if (null == this.context_menu["MenuItem2"]) {
                
    var id = dojo.widget.createWidget("MenuItem2"{caption: "Page Info"});
                dojo.log.info (id);
                
    this.context_menu["MenuItem2"= id;
                m.addChild(id);
            }

            
            
    //m.destroyChildren ();
            dojo.log.info (m);
            
    //w.destory ();
            
        }
    ;


    在這里可以根據(jù)節(jié)點(diǎn)來(lái)增刪菜單項(xiàng)了,context_menu成員是用來(lái)記錄加入過(guò)的菜單項(xiàng),以免重復(fù)加入。
    另外,removeChild沒(méi)有destory掉菜單項(xiàng),應(yīng)該可以重復(fù)使用。所以,我設(shè)想的實(shí)現(xiàn)是,在程序開(kāi)頭將所有可能的菜單項(xiàng)動(dòng)態(tài)創(chuàng)建好,存在一個(gè)MAP中,然后,在這里來(lái)動(dòng)態(tài)加刪它們。


    下面是尋找解決方法的過(guò)程:

    剛開(kāi)始時(shí),我想是改變整個(gè)樹(shù)的菜單,確實(shí)也找到了可以編程改變它的方法:

    var ctxMenu = dojo.widget.byId("contextMenu");
    var tree = dojo.widget.byId("phyTree");
    dojo.log.info (ctxMenu);

    ctxMenu.listenTree(tree);
    ctxMenu.bindDomNode(tree.domNode); 

    關(guān)鍵是一句:bindDomNode。
    這樣雖然可以動(dòng)態(tài)“加載”菜單了,可是沒(méi)有“時(shí)機(jī)”來(lái)加載新菜單,無(wú)法達(dá)到根據(jù)節(jié)點(diǎn)變化來(lái)做改變。


    隨后,我又想到重載,去創(chuàng)造這個(gè)“時(shí)機(jī)”:

    dojo.require ("dojo.widget.TreeContextMenuV3");

    dojo.provide(
    "mywidgets.MyTreeContextMenu");

    dojo.widget.defineWidget(
        
    // widget name and class
        "mywidgets.MyTreeContextMenu",
        
        
    // superclass
        [dojo.widget.TreeContextMenuV3],

        
    function() {
            dojo.log.info (
    "my context menu create1");
        }
    ,    
        
        
    // properties and methods
        {
            open: 
    function() {
                
    var result = dojo.widget.PopupMenu2.prototype.open.apply(this, arguments);
        
                dojo.log.info (
    "my context menu create");
                
    for(var i=0; i< this.children.length; i++{
                    
    /* notify children */
                    
    if (this.children[i].menuOpen) {
                        
    this.children[i].menuOpen(this.getTreeNode());
                    }

                }

                
    return result;
            }

        }

    );


    這也是我第一次重載DOJO,發(fā)現(xiàn)其實(shí)很簡(jiǎn)單,關(guān)鍵要注意它的namespace:
    dojo.require()語(yǔ)句的尋找方法是:
    dojo.xxx => dojo/src/xxx.js

    dojo.xxx.yyy => dojo/src/xxx/yyy.js

    dojo.xxx.yyy.zzz => dojo/src/xxx/yyy/zzz.js

    如果遇到不是dojo開(kāi)頭時(shí),它的尋找方法是:
    example.xxx => dojo/../example/xxx.js

    example.xxx.yyy => dojo/../example/xxx/yyy.js

    example.xxx.yyy.zzz => dojo/../example/xxx/yyy/zzz.js

    所以要把自己的代碼放到跟dojo同級(jí)就可以了。
    這個(gè)辦法我沒(méi)往下試,因?yàn)橹剌d的是contextmenu,在它里面把它“整個(gè)自己”換成別的menu,我覺(jué)得是不可行的。而看半天代碼也沒(méi)找著在哪重載右鍵點(diǎn)擊這個(gè)事件。不過(guò)啟發(fā)我可以更換子item來(lái)解決。
    于是有了開(kāi)頭的解決方案。

    posted on 2007-07-01 11:15 我愛(ài)佳娃 閱讀(2613) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): AJAX

    評(píng)論:
    # re: 在dojo的TreeV3中實(shí)現(xiàn)動(dòng)態(tài)的上下文菜單TreeContextMenuV3[未登錄](méi) 2007-08-30 09:00 | 小強(qiáng)
    想問(wèn)下你有沒(méi)有考慮 后臺(tái)如何來(lái)取得修改后的樹(shù)。即如何來(lái)取得整個(gè)樹(shù)的所有節(jié)點(diǎn)以及其之間的關(guān)系  回復(fù)  更多評(píng)論
      
    # re: 在dojo的TreeV3中實(shí)現(xiàn)動(dòng)態(tài)的上下文菜單TreeContextMenuV3 2007-09-10 10:58 | 我愛(ài)佳娃
    DOJO太慢,最近在研究其它庫(kù)。
    不如試下YUI-EXT這個(gè)庫(kù),誰(shuí)用誰(shuí)知道。  回復(fù)  更多評(píng)論
      
    # re: 在dojo的TreeV3中實(shí)現(xiàn)動(dòng)態(tài)的上下文菜單TreeContextMenuV3 2007-12-21 11:24 | wudili
    兄弟,多謝,我想了3天了.
    甚至想過(guò)重寫(xiě),還是你牛!  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲AV综合色一区二区三区| 国产精品亚洲不卡一区二区三区| 亚洲视频2020| 日韩精品无码免费专区午夜| 久久久久亚洲AV综合波多野结衣| 一级毛片免费播放视频| 亚洲日本韩国在线| 国产真人无码作爱免费视频| 相泽亚洲一区中文字幕| 中文字幕乱理片免费完整的| 亚洲AV永久无码精品成人| 免费看搞黄视频网站| 亚洲精品永久www忘忧草| 4399好看日本在线电影免费| 亚洲日日做天天做日日谢| 成人永久免费高清| selaoban在线视频免费精品| 国产日产亚洲系列| 99精品视频在线观看免费专区| 亚洲国产成人精品无码一区二区| 免费H网站在线观看的| 亚洲国产AV一区二区三区四区| 国产一区二区三区免费视频| 男女一边桶一边摸一边脱视频免费| 亚洲AV无码不卡在线播放| 免费福利视频导航| 国产亚洲精品美女久久久久| 亚洲精品~无码抽插| **俄罗斯毛片免费| 老司机午夜性生免费福利| 九月丁香婷婷亚洲综合色| 福利免费观看午夜体检区| 美女视频黄视大全视频免费的| 亚洲日韩aⅴ在线视频| h片在线免费观看| 一本久久免费视频| 亚洲福利视频网址| 亚洲国产精品一区二区第四页| 久久免费国产视频| 精品在线观看免费| 亚洲黄色网址在线观看|