TreeGrid를 XML 문서에 바인딩

샘플은 XML 문서를 계층적 데이터 소스로 사용하여 FlexGrid 컨트롤로 TreeGrid를 생성하는 방법을 보여줍니다. 예제에서는 DOMParser 객체를 사용하여 XML 문자열을 Document 객체로 구문 분석하고, 해당 Document를 반복하여 "category" 항목을 생성합니다. 각 항목은 "products" 배열을 가지고 있습니다. 이 배열은 itemsSource에 사용되며, childItemsPath 속성은 각 카테고리의 제품을 TreeGrid 형식으로 표시하는 데 사용됩니다.

XML 바인딩 문서 | FlexGrid API 문서

import 'bootstrap.css'; import '@mescius/wijmo.styles/wijmo.css'; import './styles.css'; import * as wjGrid from '@mescius/wijmo.grid'; // document.readyState === 'complete' ? init() : window.onload = init; // function init() { // var theGrid = new wjGrid.FlexGrid('#theGrid', { autoGenerateColumns: false, columns: [ { binding: 'name', header: 'Name', width: '3*' }, { binding: 'id', header: 'ID', dataType: 'String', width: '*' }, { binding: 'price', header: 'Unit Price', format: 'n2', dataType: 'Number', width: '*' }, ], headersVisibility: 'Column', childItemsPath: 'products', treeIndent: 25, itemsSource: getProductsByCategory() }); // // parse an XML document into an array function getProductsByCategory() { var items = [], parser = new DOMParser(), xml = getXml(), doc = parser.parseFromString(xml, 'application/xml'); // // get categories var categories = doc.querySelectorAll('category'); for (var c = 0; c < categories.length; c++) { var category = categories[c]; items.push({ id: parseInt(category.getAttribute('id')), name: category.getAttribute('name'), products: [] }); // // get products in this category var products = category.querySelectorAll('product'); for (var p = 0; p < products.length; p++) { var product = products[p]; items[items.length - 1].products.push({ id: parseInt(product.getAttribute('id')), name: product.getAttribute('name'), price: parseFloat(product.getAttribute('price')) }); } } // // all done return items; } // // get the XML string used as a data source function getXml() { return '<categories>' + '<category id="0" name="Beverages">' + '<product id="1" name="Chai" price="18" />' + '<product id="2" name="Chang" price="19" />' + '<product id="24" name="Guarana Fantastica" price="4.5" />' + '<product id="34" name="Sasquatch Ale" price="14" />' + '</category>' + '<category id="1" name="Condiments">' + '<product id="3" name="Aniseed Syrup" price="10" />' + '<product id="4" name="Chef Anton\'s Cajun Seasoning" price="22" />' + '<product id="5" name="Chef Anton\'s Gumbo Mix" price="21.35" />' + '<product id="6" name="Grandma\'s Boysenberry Spread" price="25" />' + '<product id="8" name="Northwoods Cranberry Sauce" price="40" />' + '<product id="15" name=" Genen Shouyu" price="15.5" />' + '</category>' + '<category id="2" name="Confections">' + '<product id="16" name="Pavlova" price="17.45" />' + '<product id="19" name="Teatime Chocolate Biscuits" price="9.2" />' + '<product id="20" name="Sir Rodney\'s Marmalade" price="81" />' + '<product id="21" name="Sir Rodney\'s Scones" price="10" />' + '<product id="25" name="NuNuCa Nuß-Nougat-Creme" price="14" />' + '<product id="26" name="Gumbär Gummibärchen" price="31.23" />' + '<product id="27" name="Schoggi Schokolade" price="43.9" />' + '</category>' + '<category id="3" name="Dairy Products">' + '<product id="11" name="Queso Cabrales" price="21" />' + '<product id="12" name="Queso Manchego La Pastora" price="38" />' + '<product id="31" name="Gorgonzola Telino" price="12.5" />' + '<product id="32" name="Mascarpone Fabioli" price="32" />' + '<product id="33" name="Geitost" price="2.5" />' + '<product id="59" name="Raclette Courdavault" price="55" />' + '<product id="60" name="Camembert Pierrot" price="34" />' + '<product id="69" name="Gudbrandsdalsost" price="36" />' + '</category>' + '<category id="4" name="Grains/Cereals">' + '<product id="22" name="Gustaf\'s Knäckebröd" price="21" />' + '<product id="23" name="Tunnbröd" price="9" />' + '<product id="42" name="Singaporean Hokkien Fried Mee" price="14" />' + '<product id="52" name="Filo Mix" price="7" />' + '<product id="56" name="Gnocchi di nonna Alice" price="38" />' + '<product id="57" name="Ravioli Angelo" price="19.5" />' + '<product id="64" name="Wimmers gute Semmelknödel" price="33.25" />' + '</category>' + '<category id="5" name="Meat/Poultry">' + '<product id="9" name="Mishi Kobe Niku" price="97" />' + '<product id="17" name="Alice Mutton" price="39" />' + '<product id="29" name="Thüringer Rostbratwurst" price="123.79" />' + '<product id="53" name="Perth Pasties" price="32.8" />' + '<product id="54" name="Tourtière" price="7.45" />' + '<product id="55" name="Pâté chinois" price="24" />' + '</category>' + '<category id="6" name="Produce">' + '<product id="7" name="Uncle Bob\'s Organic Dried Pears" price="30" />' + '<product id="14" name="Tofu" price="23.25" />' + '<product id="28" name="Rössle Sauerkraut" price="45.6" />' + '<product id="51" name="Manjimup Dried Apples" price="53" />' + '<product id="74" name="Longlife Tofu" price="10" />' + '</category>' + '<category id="7" name="Seafood">' + '<product id="10" name="Ikura" price="31" />' + '<product id="13" name="Konbu" price="6" />' + '<product id="18" name="Carnarvon Tigers" price="62.5" />' + '<product id="30" name="Nord-Ost Matjeshering" price="25.89" />' + '<product id="36" name="Inlagd Sill" price="19" />' + '<product id="37" name="Gravad lax" price="26" />' + '<product id="40" name="Boston Crab Meat" price="18.4" />' + '</category>' + '</categories>'; } }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MESCIUS Wijmo FlexGrid Tree Grid Binding to XML Documents</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- SystemJS --> <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.21.5/system.src.js" integrity="sha512-skZbMyvYdNoZfLmiGn5ii6KmklM82rYX2uWctBhzaXPxJgiv4XBwJnFGr5k8s+6tE1pcR1nuTKghozJHyzMcoA==" crossorigin="anonymous"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app'); </script> </head> <body> <div class="container-fluid"> <div id="theGrid"></div> </div> </body> </html>
.wj-flexgrid { height: 300px; } .wj-flexgrid .wj-group:not(.wj-state-selected):not(.wj-state-multi-selected) { background: white; color: #444; border-bottom: none; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'jszip': 'npm:jszip/dist/jszip.js', '@mescius/wijmo': 'npm:@mescius/wijmo/index.js', '@mescius/wijmo.input': 'npm:@mescius/wijmo.input/index.js', '@mescius/wijmo.styles': 'npm:@mescius/wijmo.styles', '@mescius/wijmo.cultures': 'npm:@mescius/wijmo.cultures', '@mescius/wijmo.chart': 'npm:@mescius/wijmo.chart/index.js', '@mescius/wijmo.chart.analytics': 'npm:@mescius/wijmo.chart.analytics/index.js', '@mescius/wijmo.chart.animation': 'npm:@mescius/wijmo.chart.animation/index.js', '@mescius/wijmo.chart.annotation': 'npm:@mescius/wijmo.chart.annotation/index.js', '@mescius/wijmo.chart.finance': 'npm:@mescius/wijmo.chart.finance/index.js', '@mescius/wijmo.chart.finance.analytics': 'npm:@mescius/wijmo.chart.finance.analytics/index.js', '@mescius/wijmo.chart.hierarchical': 'npm:@mescius/wijmo.chart.hierarchical/index.js', '@mescius/wijmo.chart.interaction': 'npm:@mescius/wijmo.chart.interaction/index.js', '@mescius/wijmo.chart.radar': 'npm:@mescius/wijmo.chart.radar/index.js', '@mescius/wijmo.chart.render': 'npm:@mescius/wijmo.chart.render/index.js', '@mescius/wijmo.chart.webgl': 'npm:@mescius/wijmo.chart.webgl/index.js', '@mescius/wijmo.chart.map': 'npm:@mescius/wijmo.chart.map/index.js', '@mescius/wijmo.gauge': 'npm:@mescius/wijmo.gauge/index.js', '@mescius/wijmo.grid': 'npm:@mescius/wijmo.grid/index.js', '@mescius/wijmo.grid.detail': 'npm:@mescius/wijmo.grid.detail/index.js', '@mescius/wijmo.grid.filter': 'npm:@mescius/wijmo.grid.filter/index.js', '@mescius/wijmo.grid.search': 'npm:@mescius/wijmo.grid.search/index.js', '@mescius/wijmo.grid.grouppanel': 'npm:@mescius/wijmo.grid.grouppanel/index.js', '@mescius/wijmo.grid.multirow': 'npm:@mescius/wijmo.grid.multirow/index.js', '@mescius/wijmo.grid.transposed': 'npm:@mescius/wijmo.grid.transposed/index.js', '@mescius/wijmo.grid.transposedmultirow': 'npm:@mescius/wijmo.grid.transposedmultirow/index.js', '@mescius/wijmo.grid.pdf': 'npm:@mescius/wijmo.grid.pdf/index.js', '@mescius/wijmo.grid.sheet': 'npm:@mescius/wijmo.grid.sheet/index.js', '@mescius/wijmo.grid.xlsx': 'npm:@mescius/wijmo.grid.xlsx/index.js', '@mescius/wijmo.grid.selector': 'npm:@mescius/wijmo.grid.selector/index.js', '@mescius/wijmo.grid.cellmaker': 'npm:@mescius/wijmo.grid.cellmaker/index.js', '@mescius/wijmo.nav': 'npm:@mescius/wijmo.nav/index.js', '@mescius/wijmo.odata': 'npm:@mescius/wijmo.odata/index.js', '@mescius/wijmo.olap': 'npm:@mescius/wijmo.olap/index.js', '@mescius/wijmo.rest': 'npm:@mescius/wijmo.rest/index.js', '@mescius/wijmo.pdf': 'npm:@mescius/wijmo.pdf/index.js', '@mescius/wijmo.pdf.security': 'npm:@mescius/wijmo.pdf.security/index.js', '@mescius/wijmo.viewer': 'npm:@mescius/wijmo.viewer/index.js', '@mescius/wijmo.xlsx': 'npm:@mescius/wijmo.xlsx/index.js', '@mescius/wijmo.undo': 'npm:@mescius/wijmo.undo/index.js', '@mescius/wijmo.interop.grid': 'npm:@mescius/wijmo.interop.grid/index.js', '@mescius/wijmo.touch': 'npm:@mescius/wijmo.touch/index.js', '@mescius/wijmo.cloud': 'npm:@mescius/wijmo.cloud/index.js', '@mescius/wijmo.barcode': 'npm:@mescius/wijmo.barcode/index.js', '@mescius/wijmo.barcode.common': 'npm:@mescius/wijmo.barcode.common/index.js', '@mescius/wijmo.barcode.composite': 'npm:@mescius/wijmo.barcode.composite/index.js', '@mescius/wijmo.barcode.specialized': 'npm:@mescius/wijmo.barcode.specialized/index.js', 'jszip': 'npm:jszip/dist/jszip.js', 'bootstrap.css': 'npm:bootstrap/dist/css/bootstrap.min.css', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);