Meteor Template.onRendered ou Template.rendered pour utiliser une bibliothèque jQuery?

Je veux utiliser choisi (une bibliothèque jquery) avec meteor et il me suffit d’utiliser ce code:

$('#ship').chosen(); 

J’ai essayé d’utiliser .onRendered mais je dois attendre, si je veux que ça fonctionne

 Template.createTradeForm.onRendered(function(){ //Strange bug, need to wait here or it doesn't work.. setTimeout(function(){ $('#ship').chosen(); }, 2000); }); 

Même problème avec cette solution:

 Template.createTradeForm.rendered = function(){ //here again, I need to wait or it doesn't work setTimeout(function(){ $('#ship').chosen(); }, 2000); }; 

Existe-t-il d’autres solutions à ce problème? Ce setTimeout n’est pas vraiment bon ici.

Modifier mon assistant comme demandé

 Template.createTradeForm.helpers({ 'getShips': function(){ return Ship.find() } }); 

envelopper votre code dans Meteor.defer , comme ceci:

 Template.createTradeForm.onRendered(function(){ Meteor.defer(function(){ $('#ship').chosen(); }); }); 

Meteor.defer correspond à un setTimeout de 0 et ce n’est pas dans la documentation. Cela résout généralement les cas où quelque chose dans le DOM dont vous dépendez n’a pas encore été rendu.

Quelques références: 1 , 2 , 3

Je ne peux que spéculer sur les causes, car davantage d’informations de débogage seraient nécessaires. (Que se passe-t-il exactement sans timeout? L’élément DOM est-il trouvé? Le plug-in jQuery est-il chosen )

Tout d’abord, rendered et onRendered sont la même chose et la dernière est la version actuelle, tandis que rendered est conservé pour la compatibilité avec le code plus ancien. Il est important de savoir que les deux ne fonctionnent qu’une seule fois. En ce qui concerne votre problème, je suppose que vous rencontrez un problème de synchronisation causé par des données d’abonnement non encore chargées. Essayez d’utiliser un abonnement pour définir une variable réactive .

  Meteor.subscribe('items', function() { readyItems.set(true); }); 

Ensuite, dépendez de la variable réactive pour utiliser le chosen :

  Tracker.autorun(function() { if(readyItems.get()) $('#ship').chosen(); });