原創(chuàng)|使用教程|編輯:郝浩|2013-07-02 17:01:59.000|閱讀 469 次
概述:界面控件套包NetAdvantage Ultimate中提供了一個(gè)專用于jQuery / HTML5開發(fā)的控件集——Ignite UI,本文主要分享Ignite UI開發(fā)jQuery響應(yīng)式網(wǎng)格的一些開發(fā)竅門。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
界面控件套包NetAdvantage Ultimate中提供了一個(gè)專用于jQuery / HTML5開發(fā)的控件集——Ignite UI,其最大特點(diǎn)是針對(duì)HTML5的穩(wěn)定的數(shù)據(jù)可視化以及迅速的性能。其適用于任何瀏覽器、任何平臺(tái)、任何設(shè)備的響應(yīng)式Web設(shè)計(jì)引起了我們的注意,經(jīng)過一段時(shí)間的測(cè)試,慧都打算和大家分享一下,Ignite UI引以為豪的的jQuery響應(yīng)式網(wǎng)格的一些開發(fā)竅門。
這一功能來(lái)自開發(fā)某個(gè)APP時(shí),我們發(fā)現(xiàn)編輯功能并沒有很好實(shí)現(xiàn),問題出在如何在如此小屏幕的手機(jī)中,為用戶提供更好更完整的網(wǎng)格編輯體驗(yàn)。一般的實(shí)現(xiàn)方式是交換列和全部網(wǎng)格可見的編輯,這是桌面應(yīng)用比較常見的網(wǎng)格編輯體驗(yàn),而這顯然在手機(jī)中是不合適的。在手機(jī)APP里面的網(wǎng)格編輯功能應(yīng)該由對(duì)話框、頁(yè)面和導(dǎo)航組成的。而Ignite UI提供的Row Edit 模板就能實(shí)現(xiàn)這個(gè)。這個(gè)模板能夠提供內(nèi)聯(lián)編輯對(duì)話框,讓開發(fā)者跳過隱藏字段這一步湊,讓響應(yīng)式網(wǎng)格的用戶體驗(yàn)非常不錯(cuò)。由于在JavaScript中,該模板允許很多值為false,所以還可以不用來(lái)回列索引來(lái)修改狀態(tài),就實(shí)現(xiàn)處理多個(gè)隱藏列。開發(fā)者可以重用一下代碼來(lái)實(shí)現(xiàn)這一功能:
{ 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; } } } //..
另外一個(gè)影響用戶體驗(yàn)的問題是,手機(jī)APP上的對(duì)話框太小,如何讓對(duì)話框盡可能的大而又不能造成需要滾動(dòng)才能顯示完,這就需要對(duì)話框的自適應(yīng)。使用rowEditDialogOpening就能實(shí)現(xiàn)這一需求,如下代碼:
//... 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; } }, //...
下圖就是最終網(wǎng)格編輯對(duì)話框的效果了:
所謂網(wǎng)格的動(dòng)態(tài)布局頁(yè)面,就是指當(dāng)窗口固定,但網(wǎng)格內(nèi)容和頁(yè)面元素可以實(shí)現(xiàn)縮放和左右移動(dòng)。這個(gè)需求在桌面應(yīng)用中幾乎不是任何問題,但是由于CSS媒體規(guī)則,在移動(dòng)應(yīng)用中這個(gè)需求很難實(shí)現(xiàn)。但是使用Ignite UI的自定義模式配置,在自定義Responsive配置中指定響應(yīng)寬度,指定模式參數(shù)或元素大小(如直接指定網(wǎng)格元素的大小,不指定窗口大小),就能實(shí)現(xiàn)這一需求了。
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())); } } } }); });
下圖就是一個(gè)可以內(nèi)置元素可以移動(dòng)的響應(yīng)式對(duì)話框:
層次化網(wǎng)格的響應(yīng)功能由于有分頁(yè)的原因,其實(shí)非常難實(shí)現(xiàn),因?yàn)槊恳粋€(gè)交互行為都會(huì)影響到下一頁(yè)的層次化布局。在平板上,網(wǎng)格顯示很有可能當(dāng)父布局由于模式改變個(gè)需要重新渲染后,子布局的狀態(tài)完全丟失。Ignite UI豐富的API同樣可以解決這個(gè)問題,使用responsiveModeChanged這個(gè)輕量級(jí)的屬性,它在布局變化或網(wǎng)格重新渲染之前就會(huì)被觸發(fā),再使用rowsRendered來(lái)觸發(fā)子布局狀態(tài)的存儲(chǔ)控件,代碼如下:
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())); } } } }); });
結(jié)果如下圖所示:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都控件網(wǎng)