找回密码
 立即注册

QQ登录

只需一步,快速开始

songjiefa

注册会员

3

主题

7

帖子

69

积分

注册会员

积分
69
最新发帖
songjiefa
注册会员   /  发表于:2016-7-19 17:27  /   查看:4423  /  回复:1
创建一个嵌套表,表大概有200行,在一页显示,每一行的嵌套表也有200行左右,有itemformatter等事件。纯前端运行都会很卡,有什么性能优化建议?
Chrome 都已经这样了,IE更卡。

代码如下,写的很乱,有一些样式没加载进来,看不下去的话,可以自己重新写一个,就一个嵌套表有onclick、 itemFormatter 、formatItem.addHandler、tooltip(在itemFormatter里,用mouseover mouseout事件)
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <title></title>
  5.         <style>
  6.                 /*
  7. // &#169; 2016 Dell Inc.
  8. // ALL RIGHTS RESERVED.
  9. */

  10. .wj-flexgrid {
  11.     font-family: Tahoma, Arial, Helvetica, sans-serif;
  12. }

  13. .wj-content {
  14.     border: none;
  15.     border-radius: 0;
  16. }

  17. .wj-flexgrid div.grid-actionCell {
  18.     cursor: pointer;
  19.     padding: 0.5rem;
  20.     text-align: center;
  21. }

  22. /* selected */

  23. .wj-flexgrid div.wj-state-multi-selected {
  24.     color:#000000;
  25.         background-color:#b6bdca;
  26. }

  27. .wj-flexgrid div.wj-state-selected {
  28.     color:#000000;
  29.         background-color:#b6bdca;
  30. }

  31. /* highlight rows on hover */

  32. .wj-flexgrid .wj-cell {
  33.     border: none;
  34.     font-size: 11px;
  35.     padding: 0.5rem;
  36.         background-color: #ffffff;
  37. }

  38. .wj-flexgrid .wj-cell:not(.wj-header):not(.wj-group):not(.wj-alt):not(.wj-state-selected):not(.wj-state-multi-selected) {
  39.         background-color: #f2f2f2;
  40. }

  41. .wj-flexgrid .wj-cell.wj-header {
  42.     color: #515967;
  43.     font-size: 12px;
  44.     cursor: pointer;
  45. }

  46. .wj-flexgrid .wj-cell.wj-header:hover {
  47.     color: #0078b6;
  48. }

  49. .wj-flexgrid .wj-cell.wj-highlight-row {
  50.         background-color: #80adbf !important;
  51.         color: #ffffff;
  52. }


  53. /* NESTED TABLE */
  54. .wj-detail {
  55.     padding: 0px !important; /* remove the cell padding */
  56. }

  57. .wj-detail>.wj-flexgrid {
  58.     padding: 0.5rem 0rem 1rem 3rem;
  59. }


  60. /* Tooltip */
  61. .wj-tooltip {
  62.         word-wrap:break-word;
  63. }

  64. /*customization page*/
  65. .wj-cell .grid-actionDrag {
  66.     background: url('../img/dragdots.png') no-repeat center;
  67. }

  68. .wj-cell .text-tertiary{
  69.     opacity: 0.6;
  70.     cursor:text
  71. }

  72. .wj-cell .grid-actionCell_disabled{
  73.     cursor:auto;
  74.     opacity: .6;
  75. }
  76.         </style>
  77.     <!--jQuery References-->
  78.     <script src="http://code.jquery.com/jquery-1.11.1.min.js" type="text/javascript"></script>
  79.     <!-- Wijmo references (required) -->
  80.     <script src="http://cdn.wijmo.com/5.20152.84/controls/wijmo.min.js" type="text/javascript"></script>
  81.     <link href="http://cdn.wijmo.com/5.20152.84/styles/wijmo.min.css" rel="stylesheet" type="text/css" />

  82.     <!-- Wijmo controls (optional, include the controls you need) -->
  83.     <script src="http://cdn.wijmo.com/5.20152.84/controls/wijmo.grid.min.js" type="text/javascript"></script>
  84.     <script src="scripts/wijmo.grid.detail.min.js"></script>
  85.     <script src="scripts/wijmo.odata.min.js"></script>
  86.         <script src="http://underscorejs.org/underscore.js"></script>
  87.     <script type="text/javascript">
  88.         var countryData, statesData,grid;
  89.         $(document).ready(function () {
  90.             var countries = 'US,Germany,UK,Japan,Italy,Greece'.split(',');
  91.             var cdata = [];
  92.             for (var i = 0; i < 20; i++) {
  93.                 cdata.push({
  94.                     cid: i,
  95.                     country: countries[i % countries.length],
  96.                     date: new Date(2014, i % 12, i % 28),
  97.                     amount: Math.random() * 10000,
  98.                     active: i % 4 === 0
  99.                 });
  100.             }
  101.             var sdata = getRows();
  102.                         var nestedData = [];
  103.                         for(var i=0;i<sdata.length;i++){
  104.                                 if(sdata[i].qoeData)
  105.                                 nestedData.push(sdata[i].qoeData);
  106.                         }
  107.                 function getRows() {
  108.                         var result = [], users = [
  109.                                 'Jean-Pierre Beale',
  110.                                 'Beaufort Paolo',
  111.                                 'Clayborne Royce',
  112.                                 'Coleman Yacov',
  113.                                 'Iskar Jarak',
  114.                                 'Locke Lamora',
  115.                                 'Tavi Rillwater',
  116.                                 'Jack Torrance',
  117.                                 'Harry Dresden',
  118.                                 'Jeff Burns',
  119.                                 'Lee Young',
  120.                                 'Sam Harding',
  121.                                 'Kate Nielsen',
  122.                                 'Louis McConnery',
  123.                                 'John Loeb'
  124.                         ], clients = [
  125.                                 'iPad OS 5.0.1',
  126.                                 'Skype for Business',
  127.                                 'iPhone OS 4.3.2',
  128.                                 'iPhone OS 5.0.1',
  129.                                 'Microsoft Office Communicator 2007 R2',
  130.                                 'Microsoft Lync Communicator for Mac 2011',
  131.                                 'Microsoft Lync 2013'
  132.                         ], callQualities = [
  133.                                 'Poor',
  134.                                 'Good'
  135.                         ],
  136.                         staticDate = new Date('2014-09-26'), startDate, organizer, numberOfRows = 200, participants, participantClients, index, participantIndex, numberOfParticipants, row;
  137.                         for (index = 0; index < numberOfRows; index++) {
  138.                                 startDate = new Date(staticDate.getTime() + (_.random(1000) * 60000));
  139.                                 organizer = users[_.random(users.length - 1)];
  140.                                 numberOfParticipants = _.random(5) + 200;
  141.                                 participants = [organizer];
  142.                                 participantClients = [clients[_.random(clients.length - 1)]];
  143.                                 for (participantIndex = 0; participantIndex < numberOfParticipants; participantIndex++) {
  144.                                         participants.push(users[_.random(users.length - 1)]);
  145.                                         participantClients.push(clients[_.random(clients.length - 1)]);
  146.                                 }
  147.                                 row = {
  148.                                         startDate: startDate,
  149.                                         duration: _.random(100) + 10,
  150.                                         organizer: organizer,
  151.                                         participants: participants.join('; '),
  152.                                         callQuality: callQualities[_.random(callQualities.length - 1)],
  153.                                         participantsClientVersion: participantClients.join('; '),
  154.                                         qoeData: []
  155.                                 };
  156.                                 addQoeData(row, participants);
  157.                                 result.push(row);
  158.                         }
  159.                         return result;
  160.     };
  161.     function addQoeData(row, participants) {
  162.         var _this = this;
  163.         var callQualities = [
  164.             'Poor',
  165.             'Good'
  166.         ];
  167.         _.each(participants, function (participant) {
  168.             row.qoeData.push({
  169.                 sessionDisplayName: participant,
  170.                 startDate: row.startDate,
  171.                 callQuality: callQualities[_.random(callQualities.length - 1)],
  172.                 mediaType: 'Video',
  173.                 direction: 'Incoming',
  174.                 latency: getNumber(),
  175.                 mosDegredation: getNumber(),
  176.                 listenMos: getNumber(),
  177.                 packetsLost: getNumber(),
  178.                 jitter: getNumber()
  179.             });
  180.             row.qoeData.push({
  181.                 sessionDisplayName: participant,
  182.                 startDate: row.startDate,
  183.                 callQuality: callQualities[_.random(callQualities.length - 1)],
  184.                 mediaType: 'Video',
  185.                 direction: 'Outgoing',
  186.                 latency: getNumber(),
  187.                 mosDegredation: getNumber(),
  188.                 listenMos: getNumber(),
  189.                 packetsLost: getNumber(),
  190.                 jitter: getNumber()
  191.             });
  192.             row.qoeData.push({
  193.                 sessionDisplayName: participant,
  194.                 startDate: row.startDate,
  195.                 callQuality: callQualities[_.random(callQualities.length - 1)],
  196.                 mediaType: 'Application Sharing',
  197.                 direction: 'Incoming',
  198.                 latency: getNumber(),
  199.                 mosDegredation: getNumber(),
  200.                 listenMos: getNumber(),
  201.                 packetsLost: getNumber(),
  202.                 jitter: getNumber()
  203.             });
  204.             row.qoeData.push({
  205.                 sessionDisplayName: participant,
  206.                 startDate: row.startDate,
  207.                 callQuality: callQualities[_.random(callQualities.length - 1)],
  208.                 mediaType: 'Application Sharing',
  209.                 direction: 'Outgoing',
  210.                 latency: getNumber(),
  211.                 mosDegredation: getNumber(),
  212.                 listenMos: getNumber(),
  213.                 packetsLost: getNumber(),
  214.                 jitter: getNumber()
  215.             });
  216.             row.qoeData.push({
  217.                 sessionDisplayName: participant,
  218.                 startDate: row.startDate,
  219.                 callQuality: callQualities[_.random(callQualities.length - 1)],
  220.                 mediaType: 'Audio',
  221.                 direction: 'Incoming',
  222.                 latency: getNumber(),
  223.                 mosDegredation: getNumber(),
  224.                 listenMos: getNumber(),
  225.                 packetsLost: getNumber(),
  226.                 jitter: getNumber()
  227.             });
  228.             row.qoeData.push({
  229.                 sessionDisplayName: participant,
  230.                 startDate: row.startDate,
  231.                 callQuality: callQualities[_.random(callQualities.length - 1)],
  232.                 mediaType: 'Audio',
  233.                 direction: 'Outgoing',
  234.                 latency: getNumber(),
  235.                 mosDegredation: getNumber(),
  236.                 listenMos: getNumber(),
  237.                 packetsLost: getNumber(),
  238.                 jitter: getNumber()
  239.             });
  240.         });
  241.     };
  242.     function getNumber() {
  243.         if (_.random(10) < 4) {
  244.             return '<none>';
  245.         }
  246.         else {
  247.             return ((_.random(3000) + 100) / 10).toFixed(1);
  248.         }
  249.     };
  250.             


  251.             // get categories and products from server
  252.             countryData = new wijmo.collections.CollectionView(sdata);
  253.             statesData = new wijmo.collections.CollectionView(nestedData);

  254.             // initialize detail visibility mode
  255.             //var detailMode = wijmo.grid.detail.DetailVisibilityMode.ExpandSingle;

  256.             grid = new wijmo.grid.FlexGrid('#gsFlexGrid');
  257.             grid.itemsSource = countryData;
  258.                        
  259.                        
  260.                                 var dp = new wijmo.grid.detail.FlexGridDetailProvider(grid);
  261.                                 dp.detailVisibilityMode = wijmo.grid.detail.DetailVisibilityMode.ExpandMulti;
  262.                                 dp.createDetailCell = function (row) {
  263.                                         var cell = document.createElement('div');
  264.                                         grid.hostElement.appendChild(cell);
  265.                                         var detailGrid = new wijmo.grid.FlexGrid(cell, {
  266.                                                 headersVisibility: wijmo.grid.HeadersVisibility.Column,
  267.                                                 autoGenerateColumns: false,
  268.                                                 selectionMode: wijmo.grid.SelectionMode.ListBox,
  269.                                                 itemsSource:row.dataItem.qoeData,
  270.                                                 columns: [
  271.                                                         { header: 'sessionDisplayName', binding: 'sessionDisplayName' },
  272.                                                         { header: 'startDate', binding: 'startDate' },
  273.                                                         { header: 'callQuality', binding: 'callQuality' },
  274.                                                         { header: 'mediaType', binding: 'mediaType' },
  275.                                                         { header: 'direction', binding: 'direction' },
  276.                                                         { header: 'latency', binding: 'latency' },
  277.                                                         { header: 'mosDegredation', binding: 'mosDegredation' },
  278.                                                         { header: 'listenMos', binding: 'listenMos' },
  279.                                                         { header: 'packetsLost', binding: 'packetsLost' },
  280.                                                         { header: 'jitter', binding: 'jitter' }
  281.                                                 ]
  282.                                         });
  283.                                   
  284.                                         return cell;
  285.                                 };
  286.                        
  287.                        
  288.                         this.onclick = onCellClicked;
  289.                         grid.itemFormatter = function (panel, r, c, cell) {
  290.                                 if (panel.cellType === wijmo.grid.CellType.ColumnHeader) {
  291.                                    removeMultiSortArrow(panel, c, cell);
  292.                                 }
  293.                         };
  294.                         dp.itemFormatter = function (panel, r, c, cell) {
  295.                         if (panel.cellType === wijmo.grid.CellType.ColumnHeader) {
  296.                             removeMultiSortArrow(panel, c, cell);
  297.                         }
  298.                     };
  299.                         function removeMultiSortArrow(panel, c, cell) {
  300.                                 var col = panel.columns[c], cv = panel.grid.collectionView;
  301.                                 if (cv && cv.sortDescriptions.length > 0) {
  302.                                         if (cv.sortDescriptions[0].property !== col.binding) {
  303.                                                 cell.innerHTML = col.header;
  304.                                         }
  305.                                 }
  306.                         };
  307.                         grid.formatItem.addHandler(function(grid,event){
  308.                                 this.addTooltips(grid,event);
  309.                                 if (event.panel.cellType === wijmo.grid.CellType.RowHeader) {
  310.                 this.addDetailRowButton(event);
  311.             }
  312.             else if (event.panel.cellType === wijmo.grid.CellType.Cell) {
  313.                 this.addRowHighlightOnHover(grid, event);
  314.                 this.addTextFormatters(grid, grid.columns, event);
  315.                 this.addButtons(grid, grid.columns, event);
  316.             }
  317.                         });


  318.         });
  319.                
  320.                
  321.                
  322.                 function addTooltips(grid,event){
  323.                         var tooltip = new wijmo.Tooltip();
  324.         $(event.cell).mouseover(function (eventObj) {
  325.             if (event.cell.className.indexOf('wj-cell') > -1
  326.                 && event.cell.className.indexOf('wj-detail') < 0
  327.                 && event.cell.className.indexOf('table-detailRow') < 0
  328.                 && event.cell.innerHTML.indexOf('title=') < 0
  329.                 && event.cell.innerHTML.replace(' ', '').length > 0) {
  330.                 tooltip.show(event.cell, event.cell.innerHTML);
  331.             }
  332.         }).mouseout(function (eventObj) {
  333.             tooltip.hide();
  334.         });
  335.                 }
  336.                
  337.                 function addButtons (grid, columns, event) {
  338.         var wijmoColumn, column, cell = event.cell;
  339.         wijmoColumn = grid.columns[event.col];
  340.         column = this.findButtonColumn(columns, wijmoColumn);
  341.         if (column && column.columnType === 2) {
  342.             $('<span>').
  343.                 addClass(grid.rows[event.row].dataItem.dataItem.removableClass).
  344.                 addClass(column.iconClass).
  345.                 addClass('tableIcon').
  346.                 attr('title', grid.rows[event.row].dataItem.dataItem.removeTitle || column.title).
  347.                 appendTo($(cell));
  348.         }
  349.     };
  350.        
  351.         function addTextFormatters (grid, columns, event) {
  352.         var wijmoColumn, column, row, value;
  353.         wijmoColumn = grid.columns[event.col];
  354.         column = this.findColumn(columns, wijmoColumn);
  355.         if (column && column.columnType === ColumnType.plainText) {
  356.             // TODO: we want to bind to the Row (to keep ids and such), but
  357.             // this looks fishy to me
  358.             row = grid.rows[event.row].dataItem;
  359.             if (row && row.dataItem && column.textFormatter) {
  360.                 value = row.dataItem[column.fieldName];
  361.                 event.cell.innerHTML = column.textFormatter(value);
  362.             }
  363.         }
  364.     };
  365.        
  366.         function addRowHighlightOnHover (grid, event) {
  367.         var rowClassName = 'highLight_row' + grid['id'] + event.row, highlightClassName = 'wj-highlight-row', cell = event.cell, rowCell;
  368.         // NOTE: There's nothing linking wijmo rows together in the actual html :(
  369.         // Don't touch the details table parent row
  370.         $(cell).addClass(rowClassName);
  371.         $(cell).on('mouseover', null, function () {
  372.             rowCell = $('.' + rowClassName);
  373.             // The wijmo details grid container looks exactly like a row, except for the
  374.             // additional detail class. We don't want to highlight the entire grid on hover
  375.             if (!$(rowCell).hasClass('wj-detail')) {
  376.                 $(rowCell).addClass(highlightClassName);
  377.             }
  378.         });
  379.         $(cell).on('mouseout', null, function () {
  380.             $('.' + rowClassName).removeClass(highlightClassName);
  381.         });
  382.     };
  383.        
  384.          function findColumn (columns, column) {
  385.         var binding = column.binding.replace('dataItem.', '');
  386.         // TODO: this is because of the crappy binding
  387.                 for(var i=0;i<columns.length;i++){
  388.                         if(columns[i].fieldName === binding)
  389.                         return columns[i];
  390.                 }
  391.         //return columns.findWhere({ fieldName: binding });
  392.     };
  393.     function findButtonColumn (columns, column) {
  394.         //return columns.findWhere({ name: column.binding });
  395.                 for(var i=0;i<columns.length;i++){
  396.                         if(columns[i].name === column.binding)
  397.                         return columns[i];
  398.                 }
  399.     };
  400.        
  401.         function addDetailRowButton (event) {
  402.         var iconClass, isExpanded;
  403.         if (this.detail && this.detail.isDetailAvailable(event.row)) {
  404.             isExpanded = this.detail.isDetailVisible(event.row);
  405.             iconClass = isExpanded ? 'wj-glyph-down-right' : 'wj-glyph-right';
  406.             $(event.cell)
  407.                 .addClass('table-detailRow')
  408.                 .attr('data-rowIndex', event.row);
  409.             $('<span class="' + iconClass + '"></span>').appendTo(event.cell);
  410.         }
  411.     };
  412.         var _this = this;
  413.         function onCellClicked (event) {
  414.         var isNestedRow, $obj = $(event.currentTarget), hitInfo;
  415.         isNestedRow = $obj.hasClass('wj-detail') || $obj.parents('.wj-detail').length > 0;
  416.         if (isNestedRow) {
  417.         }
  418.         else {
  419.             hitInfo = grid.hitTest(event);
  420.             switch (hitInfo.cellType) {
  421.                 case wijmo.grid.CellType.ColumnHeader:
  422.                     onHeaderCellClicked(event, hitInfo);
  423.                     break;
  424.                 case wijmo.grid.CellType.Cell:
  425.                     //_this.onRowCellClicked(event, hitInfo);
  426.                     break;
  427.                 case wijmo.grid.CellType.RowHeader:
  428.                     onDetailRowHeaderClicked(event);
  429.                     break;
  430.                 default:
  431.                     break;
  432.             }
  433.         }
  434.         event.stopPropagation();
  435.     };
  436.        
  437.          function onDetailRowHeaderClicked (event) {
  438.         var rowIndex, $icon;
  439.         rowIndex = parseInt($(event.currentTarget).attr('data-rowIndex'), 10);
  440.         if (!isNaN(rowIndex)) {
  441.             $icon = $(event.currentTarget).children().first();
  442.             if (this.detail.isDetailVisible(rowIndex)) {
  443.                 $icon.removeClass('wj-glyph-down-right');
  444.                 $icon.addClass('wj-glyph-right');
  445.                 this.detail.hideDetail(rowIndex);
  446.             }
  447.             else {
  448.                 $icon.removeClass('wj-glyph-right');
  449.                 $icon.addClass('wj-glyph-down-right');
  450.                 this.detail.showDetail(rowIndex);
  451.             }
  452.         }
  453.     };
  454.        
  455.         function onDetailRowHeaderClicked (event) {
  456.         var rowIndex, $icon;
  457.         rowIndex = parseInt($(event.currentTarget).attr('data-rowIndex'), 10);
  458.         if (!isNaN(rowIndex)) {
  459.             $icon = $(event.currentTarget).children().first();
  460.             if (this.detail.isDetailVisible(rowIndex)) {
  461.                 $icon.removeClass('wj-glyph-down-right');
  462.                 $icon.addClass('wj-glyph-right');
  463.                 this.detail.hideDetail(rowIndex);
  464.             }
  465.             else {
  466.                 $icon.removeClass('wj-glyph-right');
  467.                 $icon.addClass('wj-glyph-down-right');
  468.                 this.detail.showDetail(rowIndex);
  469.             }
  470.         }
  471.     };        
  472.     </script>
  473. </head>
  474. <body>
  475.     <div id="gsFlexGrid" style="width:100%;overflow:scroll"></div>
  476. </body>
  477. </html>
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

1 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2016-7-20 10:46:54
沙发
谢谢您的反馈。
数据大的确会影响到性能,一些性能优化的建议:
1.设置flexgrid的size。因为它的尺寸影响到内容的展示,如果不指定尺寸,绑定时候就会创建一个非常大的grid。
方法很简单,如下面代码,仅仅设置尺寸:
  1. <div id="gsFlexGrid" style="height:350px"></div>
复制代码

有关尺寸设置可以更多的参考产品文档:http://wijmo.com/5/docs/static/sizingAndStyling.html

2.如果是有自定义Cell,可以使用CellTemplate替换itemFormatter提高性能。
CellTemplate的使用示例:http://demos.wijmo.com/5/Angular ... /CellTemplateIntro/

3.FlexGridDetailProvider 使用方法参考:
http://demos.wijmo.com/5/Angular/RowDetails/RowDetails/
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部