Récemment, comme je l'ai noté dans un
article précédent, les composants Web des wrappers pour les frameworks populaires qui permettent de les utiliser via l'API du navigateur se développent activement. Cela signifie que si vous souhaitez utiliser des composants prêts à l'emploi créés sur une infrastructure particulière, vous n'avez pas besoin de déployer le projet et de l'assembler. Cela signifie également que vous pouvez utiliser le développement sur différents cadres en les liant ensemble via une interaction via l'API du navigateur.
Il n'y a pas si longtemps, j'essayais de trouver une grille décente pour les composants Web, à l'époque une telle à part entière, mais en même temps, n'obligeant pas à utiliser un cadre, surtout si c'était quelque chose comme Polymer n'était pas. Dans un passé récent, j'ai eu une expérience assez réussie avec du matériel / cdk auparavant. Ensuite, il m'a été relativement facile de personnaliser sérieusement les filtres et le pageur pour la table, de localiser les indices et tout cela sans réécrire le code de la bibliothèque ou des crochets sombres, en utilisant des mécanismes de redéfinition. Au moment de l'examen, il s'est avéré que les classeurs pour le composant table n'avaient pas encore été effectués, mais il y a quelques semaines, j'ai remarqué que quelque chose était apparu dans le référentiel sur ce sujet et j'ai décidé d'essayer de les connecter en tant que composants Web dans le cadre de l'expérience.
Afin de commencer à utiliser les composants du matériel, connectez simplement le bundle avec le code et une autre ressource avec tous les styles, tout comme les fans de VueJS. Par exemple, vous pouvez créer un champ d'entrée contrôlé par angulaire / matériau comme suit:
<link rel="stylesheet" href="https://unpkg.com/material-components-web@latest/dist/material-components-web.min.css"> <script src="https://unpkg.com/material-components-web@latest/dist/material-components-web.min.js"></script> <div class="mdc-text-field"> <input type="text" id="my-text-field" class="mdc-text-field__input"> <label class="mdc-floating-label" for="my-text-field">Label</label> <div class="mdc-line-ripple"></div> </div> <script> mdc.textField.MDCTextField.attachTo(document.querySelector('.mdc-text-field')); </script>
Et nous pouvons connecter une table pour afficher les données tout aussi facilement, directement à partir de la documentation exemple sur le
lien .
<div class="mdc-text-field"> <input type="text" id="my-text-field" class="mdc-text-field__input"> <label class="mdc-floating-label" for="my-text-field">Label</label> <div class="mdc-line-ripple"></div> </div> <div class="mdc-data-table"> <table class="mdc-data-table__table" aria-label="Dessert calories"> <thead> <tr class="mdc-data-table__header-row"> <th class="mdc-data-table__header-cell" role="columnheader" scope="col">Dessert</th> <th class="mdc-data-table__header-cell" role="columnheader" scope="col">Carbs (g)</th> <th class="mdc-data-table__header-cell" role="columnheader" scope="col">Protein (g)</th> <th class="mdc-data-table__header-cell" role="columnheader" scope="col">Comments</th> </tr> </thead> <tbody class="mdc-data-table__content"> <tr class="mdc-data-table__row"> <td class="mdc-data-table__cell">Frozen yogurt</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">24</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">4.0</td> <td class="mdc-data-table__cell">Super tasty</td> </tr> <tr class="mdc-data-table__row"> <td class="mdc-data-table__cell">Ice cream sandwich</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">37</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">4.3</td> <td class="mdc-data-table__cell">I like ice cream more</td> </tr> <tr class="mdc-data-table__row"> <td class="mdc-data-table__cell">Eclair</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">24</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">6.0</td> <td class="mdc-data-table__cell">New filing flavor</td> </tr> </tbody> </table> </div> <script src="https://unpkg.com/material-components-web@latest/dist/material-components-web.min.js"></script> <script type="module"> let filterField = mdc.textField.MDCTextField.attachTo(document.querySelector('.mdc-text-field')); let dataTable = new mdc.dataTable.MDCDataTable(document.querySelector('.mdc-data-table')); </script>
Lors de la connexion à partir de bundles unpkg avec unpkg que nous avons déjà assemblés, nous n'utilisons malheureusement pas les capacités modulaires natives du navigateur WHATWG, car ces bundles lient des composants à l'espace de noms global et à son objet mdc, plutôt que de l'exporter à l'aide de la norme modulaire ES6. Mais une telle option sera probablement plus familière aux spécialistes conservateurs et peut fonctionner sans transpilers dans les navigateurs hérités.

La liste des composants implémentés se trouve dans ce
référentiel .
Malheureusement, pour le moment, seule une sorte d'interaction avec les cases à cocher et le contenu des lignes déjà rendues est définie pour les tables dans une API accessible depuis l'extérieur.
Cependant, j'ai réussi à google un exemple qui vous permet d'accéder à l'API jusqu'ici cachée de nous, par héritage. En outre, vous devez également savoir qu'avec l'aide du projet
Angular Elements , vous pouvez développer des composants dans l'infrastructure de framework et les exposer indépendamment à l'API du navigateur et aux mêmes CustomElements.
J'ai pris tout l'exemple, en faisant quelques corrections, «pour travailler» sur la mise en page d'origine et il était clair où choisir après avoir lu l'article. Il y a beaucoup de code et maintenant il est remonté.
Code de table <link rel="stylesheet" href="https://unpkg.com/material-components-web@latest/dist/material-components-web.min.css"> <div class="mdc-text-field"> <input type="text" id="my-text-field" class="mdc-text-field__input"> <label class="mdc-floating-label" for="my-text-field">Label</label> <div class="mdc-line-ripple"></div> </div> <div class="mdc-data-table"> <table class="mdc-data-table__table" aria-label="Dessert calories"> <thead> <tr class="mdc-data-table__header-row"> <th class="mdc-data-table__header-cell" role="columnheader" scope="col">Dessert</th> <th class="mdc-data-table__header-cell" role="columnheader" scope="col">Carbs (g)</th> <th class="mdc-data-table__header-cell" role="columnheader" scope="col">Protein (g)</th> <th class="mdc-data-table__header-cell" role="columnheader" scope="col">Comments</th> </tr> </thead> <tbody class="mdc-data-table__content"> <tr class="mdc-data-table__row"> <td class="mdc-data-table__cell">Frozen yogurt</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">24</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">4.0</td> <td class="mdc-data-table__cell">Super tasty</td> </tr> <tr class="mdc-data-table__row"> <td class="mdc-data-table__cell">Ice cream sandwich</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">37</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">4.3</td> <td class="mdc-data-table__cell">I like ice cream more</td> </tr> <tr class="mdc-data-table__row"> <td class="mdc-data-table__cell">Eclair</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">24</td> <td class="mdc-data-table__cell mdc-data-table__cell--numeric">6.0</td> <td class="mdc-data-table__cell">New filing flavor</td> </tr> </tbody> </table> </div> <script src="https://unpkg.com/material-components-web@latest/dist/material-components-web.js"></script> <script type="module"> let filterField = mdc.textField.MDCTextField.attachTo(document.querySelector('.mdc-text-field')); const DATATABLE_COLUMNS_SELECTOR = `.mdc-data-table thead`, DATATABLE_DATA_SELECTOR = `tbody.mdc-data-table__content`, DATATABLE_SORTABLE_SELECTOR = `.mdc-data-table--sortable`, DATATABLE_COLUMNS_NUMERIC = `mdc-data-table--numeric`, DATATABLE_COLUMNS_SORTABLE = `mdc-data-table--sortable`, DATATABLE_COLUMNS_SORT_ASC = `mdc-data-table--sort-asc`, DATATABLE_COLUMNS_SORT_DESC = `mdc-data-table--sort-desc`; class MyDataTable extends mdc.dataTable.MDCDataTable { get data() { return this.foundation_.data; } set data(data) { if (Array.isArray(data)) { this.foundation_.setData(data); } else { throw new Error(`Expected an array`); } } layout() { if (this.foundation_.layout) { this.foundation_.layout(); } } getDefaultFoundation() { const getHeaderRow = () => { let thead = this.root_.querySelector(DATATABLE_COLUMNS_SELECTOR), row = thead.querySelector(`tr`); if (!row) { row = document.createElement(`tr`); row.setAttribute(`role`, `rowheader`); thead.appendChild(row); } return row; }, getHeaderColumns = () => { return getHeaderRow().querySelectorAll(`th`); }, emptyHeaderColumns = () => { getHeaderRow().remove(); }, getData = () => { return this.root_.querySelector(DATATABLE_DATA_SELECTOR); }, getDataRows = () => { return getData().querySelectorAll(`tr`); }, emptyData = () => { Array.prototype.map.call(getDataRows(), row => { row.remove(); }); }; return new MyDataTableFoundation({ registerSortClickHandler: (handler) => this.root_.addEventListener(`click`, handler), deregisterSortClickHandler: (handler) => this.root_.removeEventListener(`click`, handler), </script>
Cet exemple implémente un certain minimum pour la redéfinition et expose les méthodes d'interaction avec l'api qui manquent dans l'api. Grâce à cela, nous pouvons intégrer le composant table dans les entrailles du framework avec un autre composant du champ de saisie, en ajoutant notre propre fonctionnalité de filtrage.
let filterField = mdc.textField.MDCTextField.attachTo(document.querySelector('.mdc-text-field')); filterField.input_.oninput = (event) => { dataTable.origData = dataTable.origData || dataTable.data.slice(); if (event.target.value == '') { dataTable.data = dataTable.origData.slice(); } else { let data = dataTable.origData.filter((row) => { let rowIsOk = false; for (let item of row) { if (item.indexOf(event.target.value) > 0) { rowIsOk = true; } } return rowIsOk; }) || []; dataTable.data = data; dataTable.getDefaultFoundation().redraw(); } };
Sur le plan conceptuel, il n'est pas très judicieux d'implémenter le filtrage directement dans le gestionnaire d'événements.Pour cela, nous avons maintenant une classe de table et les structures d'une fondation et d'un adaptateur de données qui ont un sens plus proche, mais notre tâche aujourd'hui est de nous assurer qu'il est possible d'organiser l'interaction des composants. Et nous avons juste réussi à connecter deux composants qui n'ont pas de logique d'implémentation commune avec du code dans le contexte de l'exécution du navigateur.

après avoir entré des données dans le champ, le contenu sera filtré

Cet exemple, en particulier après avoir mis toute la logique javascript dans des fichiers de classe séparés, comme nous l'avons fait dans le
premier article de la série , peut être un point de départ pour réutiliser les composants de cdk angulaire / matériel ou une autre boîte à outils pour votre propre développement, redéfinissant le comportement de telle sorte que «Ferme collective» tout à partir de zéro ou en intégrant le nouveau code dans l'infrastructure existante, cessant d'augmenter le monolithe, car Les composants Web constituent le meilleur moyen d'organiser le développement de manière modulaire.