原創|使用教程|編輯:郝浩|2013-07-02 17:01:59.000|閱讀 469 次
概述:界面控件套包NetAdvantage Ultimate中提供了一個專用于jQuery / HTML5開發的控件集——Ignite UI,本文主要分享Ignite UI開發jQuery響應式網格的一些開發竅門。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
界面控件套包NetAdvantage Ultimate中提供了一個專用于jQuery / HTML5開發的控件集——Ignite UI,其最大特點是針對HTML5的穩定的數據可視化以及迅速的性能。其適用于任何瀏覽器、任何平臺、任何設備的響應式Web設計引起了我們的注意,經過一段時間的測試,慧都打算和大家分享一下,Ignite UI引以為豪的的jQuery響應式網格的一些開發竅門。
這一功能來自開發某個APP時,我們發現編輯功能并沒有很好實現,問題出在如何在如此小屏幕的手機中,為用戶提供更好更完整的網格編輯體驗。一般的實現方式是交換列和全部網格可見的編輯,這是桌面應用比較常見的網格編輯體驗,而這顯然在手機中是不合適的。在手機APP里面的網格編輯功能應該由對話框、頁面和導航組成的。而Ignite UI提供的Row Edit 模板就能實現這個。這個模板能夠提供內聯編輯對話框,讓開發者跳過隱藏字段這一步湊,讓響應式網格的用戶體驗非常不錯。由于在JavaScript中,該模板允許很多值為false,所以還可以不用來回列索引來修改狀態,就實現處理多個隱藏列。開發者可以重用一下代碼來實現這一功能:
{ name: "Updating", rowEditDialogOpening: function(event, ui) { var columns = ui.owner.grid.options.columns; for (i = 0; i < columns.length; ++i) { //use 0 instead of false to be able to differentiate when restoring state if (columns[i].hidden) columns[i].hidden = 0; } }, rowEditDialogOpened: function(event, ui) { var columns = ui.owner.grid.options.columns; for (i = 0; i < columns.length; ++i) { if (columns[i].hidden === 0) columns[i].hidden = true; } } } //..
另外一個影響用戶體驗的問題是,手機APP上的對話框太小,如何讓對話框盡可能的大而又不能造成需要滾動才能顯示完,這就需要對話框的自適應。使用rowEditDialogOpening就能實現這一需求,如下代碼:
//... rowEditDialogOpening: function(event, ui) { if ($(ui.owner.element).igGridResponsive("getCurrentResponsiveMode") != "desktop") { ui.owner.options.rowEditDialogWidth = document.body.clientWidth * 0.9; ui.owner.options.rowEditDialogHeight = ui.owner.grid.element.height(); ui.dialogElement.children('.ui-dialog-content').css('height',ui.owner.grid.element.height() - 115); } var columns = ui.owner.grid.options.columns; for (i = 0; i < columns.length; ++i) { //use 0 instead of false to be able to differentiate when restoring state if (columns[i].hidden) columns[i].hidden = 0; } }, //...
下圖就是最終網格編輯對話框的效果了:
所謂網格的動態布局頁面,就是指當窗口固定,但網格內容和頁面元素可以實現縮放和左右移動。這個需求在桌面應用中幾乎不是任何問題,但是由于CSS媒體規則,在移動應用中這個需求很難實現。但是使用Ignite UI的自定義模式配置,在自定義Responsive配置中指定響應寬度,指定模式參數或元素大小(如直接指定網格元素的大小,不指定窗口大小),就能實現這一需求了。
var expanded = []; $.ig.loader(function () { $('#grid').igHierarchicalGrid({ //... features: [{ name: 'Responsive', columnSettings: [{ columnKey: 'DepartmentID', classes: "ui-hidden-phone" }, { columnKey: 'ModifiedDate', classes: "ui-hidden-phone" }], responsiveModeChanged: function (evt, ui) { expanded = []; var HGrid = ui.owner.element.data("igHierarchicalGrid"); ui.owner.grid.allRows().each(function (index, row) { if (HGrid.expanded(row)) { expanded.push($(row).data("row-idx")); } }); } }], rowsRendered: function (evt, ui) { if ((len = expanded.length) > 0) { for (i = 0; i < len; i++) { ui.owner.element.data("igHierarchicalGrid").expand(ui.owner.rowAt(expanded.pop())); } } } }); });
下圖就是一個可以內置元素可以移動的響應式對話框:
層次化網格的響應功能由于有分頁的原因,其實非常難實現,因為每一個交互行為都會影響到下一頁的層次化布局。在平板上,網格顯示很有可能當父布局由于模式改變個需要重新渲染后,子布局的狀態完全丟失。Ignite UI豐富的API同樣可以解決這個問題,使用responsiveModeChanged這個輕量級的屬性,它在布局變化或網格重新渲染之前就會被觸發,再使用rowsRendered來觸發子布局狀態的存儲控件,代碼如下:
var expanded = []; $.ig.loader(function () { $('#grid').igHierarchicalGrid({ //... features: [{ name: 'Responsive', columnSettings: [{ columnKey: 'DepartmentID', classes: "ui-hidden-phone" }, { columnKey: 'ModifiedDate', classes: "ui-hidden-phone" }], responsiveModeChanged: function (evt, ui) { expanded = []; var HGrid = ui.owner.element.data("igHierarchicalGrid"); ui.owner.grid.allRows().each(function (index, row) { if (HGrid.expanded(row)) { expanded.push($(row).data("row-idx")); } }); } }], rowsRendered: function (evt, ui) { if ((len = expanded.length) > 0) { for (i = 0; i < len; i++) { ui.owner.element.data("igHierarchicalGrid").expand(ui.owner.rowAt(expanded.pop())); } } } }); });
結果如下圖所示:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網