Meteor 0.8 Blaze comment mettre à jour les modifications apportées pour les plugins Jquery

Ma question est de savoir comment obtenir un événement ou un rappel émis lorsqu'un groupe d'éléments est mis à jour dans le DOM? Si je suive le lien dans le wiki de Blaze https://github.com/avital/meteor-ui-new-rendered-callback, ce n'est pas ce que je veux. Si je suive la deuxième recommandation, j'aurai autant d'appels rendus que d'éléments. Et l'élément parent ne recevra qu'un 1 rappel rendu sur le chargement de la page.

Dans mon cas, j'utilise le plugin Footable Jquery pour formater une table. La charge initiale fonctionne bien, mais si je change une variable de filtre dans la collection, les mises à jour de DOM et les rendus ne sont plus appelés puisque Blaze ne fait appel qu'à une seule fois. Je ne veux pas le mettre dans un autre modèle, car cela signifie simplement que plusieurs appels ont été rendus et donc des appels multiples à Footable quand il n'en a besoin que pour l'ensemble de la table.

Toute aide est appréciée.

<template name="customerData"> <table class="table"> {{#each dataRows}} <tr> <td>{{first_name}}</td> <td>{{last_name}}</td> <td>{{email}}</td> {{#each phones}} <td>{{phone}}</td> {{/each}} </tr> {{/each}} </table> </template> Template.customerData.rendered = function(){ $(".table").footable(); } Template.customerData.phones = function(){ var result = []; _.each(this.phoneNumbers, function(element, index, list){ result.push({ phone: element}); }); return result; } 

La meilleure solution serait d'écrire un assistant de blocs personnalisé. Faites-le pour vous 🙂

la mise en oeuvre

 UI.registerHelper('footableBody', function () { var dependency = new Deps.Dependency(), dataSource = this, handle, footable; return UI.Component.extend({ render: function () { var self = this; return UI.Each(function () { return dataSource; }, UI.block(function () { dependency.changed(); return self.__content; })); }, rendered: function () { var $node = $(self.firstNode).closest('table'); handle = Deps.autorun(function () { if (!footable) { $node.footable(); footable = $node.data('footable'); } else { footable.redraw(); } dependency.depend(); }); }, destroyed: function () { handle && handle.stop(); }, }); }); 

Usage

Maintenant, dans vos modèles, vous pouvez faire quelque chose comme:

 <table class="table"> <thead> ... </thead> <tbody> {{#footableBody dataRows}} <tr> <td>{{first_name}}</td> <td>{{last_name}}</td> <td>{{email}}</td> <td>{{phone}}</td> </tr> {{/footableBody}} </tbody> </table> 

Bien sûr, vous devriez personnaliser le comportement de l'assistant dans vos propres besoins.

Réflexions

Il existe également une autre solution – plus générique – qui suit le schéma de la façon dont l'assistant de markdown est implémenté ici . Cependant, je n'inviterais pas à appliquer cette stratégie à votre utilisation spécifique.