1. 程式人生 > >EasyUI+js實現動態載入導航欄

EasyUI+js實現動態載入導航欄

   引言

   小編最近在做專案的時候遇到一個許可權控制的功能,就是根據許可權的大小來控制導航欄中的內容,這就遇到了

動態載入導航欄的功能了,但是根據整個介面的風格需要需要用到EasyUI,在開始的時候沒有頭緒來解決這個問題,

所以就查閱了EasyUI的API文件,俗話說:“如果學會了檢視某個技術的API文件,那麼程式設計就成功了一半”,所以我

在API文件中找到了一絲的靈感,其中有一個封裝好的方法來解決這個問題,下面給大家分享這個方法。

   API文件展示


    例項展示

   在小編的專案中的需求是這樣的,當用戶登入的時候先判斷使用者的許可權,然後就可以知道該使用者可以操作的內

容有哪些,這樣的話就可以讓導航欄中加載出這些內容,其餘的不能操作的內容,就不顯示在導航欄中。這樣的話只

有API中的這個簡單的內容是不能實現的,這裡還用到了一個比價讓人頭疼的東西,那就是DIV的拼接問題,下面就給

大家展示一下程式碼:

  首先來看一下大家都比較關心的js程式碼:

   //通過accordion+動態拼接DIV實現父選單的動態載入
    $(function () {
        
        $(function () {
          
            $.getJSON("/Role/getOperateContentByRoleName", null, function (data) {
              
                for (var m = 0; m < data.Length; m++) {
                    
                    $("#aa").accordion('add', {
                        title: data.Title[m],
                        content: "<div style='text-align:center' id='tableDiv" + m + "'>" + ini(data, m) + "</div>"
                       
                    });
                    
                }
            });
            //加載出表格
            //initTable();
            //getjson();
        });
            
      
        //加載出表格
        //initTable();
        //getjson();
    });
    //通過accordion+動態拼接DIV實現子選單的動態載入
    function ini(data, num) {
        
        var maxCol = 0;
        //var strTbody = ["<table>"];
        var strTbody = ["<table width='120px' align='center'>"];
        strTbody += "<tr>";
        for (var i = 0; i < data.Content[num].length; i++) {

            strTbody += "<td><a href='#'  style='font-size: 14px; text-align: center; margin-left: 20px; text-decoration: none;'" + "onclick=" + "AddTabs(this)" + ">" + data.Content[num][i] + "</a>" + "</td>";
            maxCol++;
            if (maxCol % 1 == 0) {
                strTbody += "</tr>";
                strTbody += "<tr>";
            }
        }
        strTbody += "</tr>";
        strTbody += "</table>";
        return strTbody;
    }

   下面來展示前臺給js傳遞資料的程式碼:
#region 獲取可操作的內容  鄭浩-2015年8月28日11:18:47
        public ActionResult getOperateContentByRoleName()
        {
            Guid roleID = new Guid(Session["RoleInfo"].ToString());
         
            List<RoleOperationsViewModel> operateContent = new List<RoleOperationsViewModel>();
            //根據roleID獲取操作內容

            operateContent = iRoleOperationsManagerWCF.QueryOperateContentByRoleID(roleID);

            int length = operateContent.Count;

            List<string> title = new List<string>();
            IList<String> tempContent = new List<String>();
            IList<IList<string>> content = new List<IList<string>>();
            
            for (int i = 0; i < length; i++)
            {

                //新增標題的時候,防止加入重複資料
                if (!title.Contains(operateContent[i].OperateContent))
                {
                    title.Add(operateContent[i].OperateContent);


                    //新增子選單
                    var OperateContentSub = from t in operateContent where t.OperateContent == operateContent[i].OperateContent select t;

                    foreach (var item in OperateContentSub)
                    {
                        tempContent.Add(item.OperateContentSub);
                    }

                    content.Add(tempContent.ToList());  //指標型別
                    tempContent.Clear();
                }

            }
            var data = new
            {
                Length = title.Count,
                Title = title,
                Content = content

            };

            return Json(data, JsonRequestBehavior.AllowGet);
        }

        #endregion

   在這小編個讀者們簡單一下解決這個問題的思路,既然是動態的載入導航欄,那麼我們的思路肯定是放在動態拼接

這個方向,因為我們的介面佈局是不固定的,所以只能通過迴圈等手段來動態的載入,在這個專案中小編首先在登入

的時候畫的一個許可權,然後根據許可權去資料庫中讀取可以操作的父選單和子選單的內容,讓後在controller中定了一

個Ilist,裡面存放兩個list分別是父選單的內容,第二個list存放的是此父選單對應的子選單,最後將這個IList傳

遞到js中,然後利用上面的程式碼進行動態的拼接,然後完成顯示。

   小結

   當小編接到這個任務的時候那叫一個愁啊,對著東西一點都不熟悉怎麼動實現這個功能呢?所以遲遲沒有下手

實現,最後沒有辦法了就利用自己的思路實現了一版,但是效果非常的不好,所以被否定了,然後在幫別人除錯程式碼

的時候偶然發現,在他們的專案中有這功能的影子,所有就看了一下。人家就是在EasyUI的封裝的基礎上進行了改

進,所以實現的非常的完美,但是自己在發現了一個方法以後,不知道怎樣去修改人家封裝好的方法,所以沒有思

路,這就體現了現在自己學的東西還非常的淺顯需要不斷的深入,所以我們在學習知識的時候不僅需要廣度更需要深

度,這樣我們才能靈活的運用這些方法,所以在以後的學習中會增加深度的思考,這樣自己提高的會更快,加油!!