Comment exécuter une fonction d'assistance après le DOM est prêt dans le météore
J'ai une liste de <li>
'qui est renseigné avec un find() à l'aide d'un Météore.démarrage comme vous le voyez ci-dessous. Puis je reçois tous les attributs de données de ces <li>
's à l'aide des données() et de le mettre dans un objet et d'essayer de retourner la console.journal afin que je puisse voir si cela fonctionne. Mais je suis null
.
Meteor.startup(function () {
Template.messages.lists = function () {
var allitems = lists.find();
return allitems;
};
var map;
map = new GMaps({
div: '#map_canvas',
lat: -12.043333,
lng: -77.028333
});
var lat = map.getCenter().lat();
var lng = map.getCenter().lng();
map.addMarker({
lat: lat,
lng: lng,
draggable: true,
title: 'Test',
dragend: function (e) {
$('#lat').val(this.getPosition().lat());
$('#lng').val(this.getPosition().lng());
}
});
console.log(getMarkers());
});
function getMarkers() {
var coordinates = {};
coordinates = $('li.message').data();
return coordinates;
}
J'ai essayé la même chose dans ma console directement et ça marche - je obtenir un objet en arrière - donc je suppose que le DOM n'est pas prêt/rempli avant que cette fonction est exécutée.
Je vais avoir du mal à comprendre la différence entre les choses comme un Météore.démarrage et le Modèle.monmodèle.rendue. Dans ce cas, il semble qu'aucun d'entre eux fonctionne comme je veux?
Quel est le bon chemin/lieu de faire des trucs avec les DOM (la traversée,l'obtention d'attributs,de la manipulation)?
modifier
que le code a changé beaucoup de choses afin de faire ce que je voulais, je poste le tout.
Meteor.startup(function () {
var map;
map = new GMaps({
div: '#map_canvas',
lat: 50.853642,
lng: 4.357452
});
Meteor.subscribe('AllMessages', function() {
var allitems = lists.find().fetch();
console.log(allitems);
allitems.forEach(function(item) {
var lat = item.location.lat;
var lng = item.location.lng;
console.log('latitude is: ' + lat);
console.log('longitude is: ' + lng);
map.addMarker({
lat: lat,
lng: lng,
draggable: true,
title: 'Test',
dragend: function(e) {
$('#lat').val(this.getPosition().lat());
$('#lng').val(this.getPosition().lng());
}
});
});
});
});
Le code ci-dessus crée une nouvelle carte de google (à l'aide de la GMaps.js plugin) à l'intérieur d'un Météore.De démarrage, puis, dans un imbriquée Abonnez-vous fetchs tous les documents d'une collection, forEaches les résultats et obtient les valeurs de latitude et longitude, puis sur pour ajouter des marqueurs dans la carte de google...
edit 2
J'ai fait ma "carte" de la variable globale, de cette façon pas besoin de nid .abonnez-vous et .de démarrage. :
Meteor.subscribe('AllMessages', function() {
var allitems = lists.find().fetch();
console.log(allitems);
allitems.forEach(function(item) {
var lat = item.location.lat;
var lng = item.location.lng;
console.log('latitude is: ' + lat);
console.log('longitude is: ' + lng);
map.addMarker({
lat: lat,
lng: lng,
draggable: true,
title: item.description,
dragend: function(e) {
$('#lat').val(this.getPosition().lat());
$('#lng').val(this.getPosition().lng());
}
});
});
});
Meteor.startup(function () {
map = new GMaps({
div: '#map_canvas',
lat: 50.853642,
lng: 4.357452
});
});
Template.messages.lists = function () {
var allitems = lists.find().fetch();
return allitems;
}
OriginalL'auteur George Katsanos | 2013-03-09
Vous devez vous connecter pour publier un commentaire.
Meteor.démarrage
Meteor.startup()
s'exécute une seule fois, de son exécution sur le client et le serveur. Ainsi, lorsque le navigateur charge et l'initiale DOM est prêt ou le serveur démarre. Comme Sohel Khalifa dit vous place de l'initialisation des fonctions ici. Ne pas définir des modèles ici parce que les modèles doivent être prêts avant cette fonction peut être tiré.Modèle.monmodèle.onRendered(function() {... })
C'est exécutée lorsque le météore a fini et rendu le DOM. En outre exécuter chaque temps le code HTML des changements dans le modèle. Donc, pour chaque élément de votre liste en tête/une modification d'un élément/mise à jour,ainsi que de la liste, vous verrez la console.journal de retourner quelque chose si vous l'utilisez pour vérifier. Il sera de retour
null
/undefined
lors de l'appel de données parfois (que je vais expliquer):Est-ce à dire que tout le DOM est prêt? NON!:
Je pense que c'est ce qui pourrait vous causer un peu de mal. Si vous utilisez les Api externes tels que Google maps, ils pourraient encore rendre la carte. le
Template.myTemplate.rendered()
signifie Meteor a fini de rendre le modèle avec le réactif de variables nécessaires. Donc, pour savoir quand votre Google maps pourrait être prêt vous avez besoin de s'accrocher dans l'API Google maps. Avoir un regardez cette questionà l'Aide de Météore.abonnez-vous
La raison pour laquelle vous pourriez obtenir
null
/undefined
tout en utilisantrendered
est parce que c'est le processus de meteor généralement affiche les données dans les modèles deVous êtes essentiellement appel
console.log(getMarkers());
avant que l'abonnement est terminé, c'est pourquoi vous obteneznull
/undefined
Meteor utilise ce résumé du processus avec des modèles & réactifs de données:
Donc, si le processus d'1) pour un très court laps de temps, vous n'avez pas de données pas encore, qui est pourquoi vous pourriez obtenir
null
(comme dans votre code) & à la première de rendre. Pour contourner cela, vous devez utiliserMeteor.subscribe
'callback qui est exécuté lorsque toutes les données sont téléchargées à partir du serveur: e.gRemarque: Avant d'utiliser cette fonction, vous devez lire la documentation sur l'utilisation de les abonnements que vous avez besoin pour retirer le
autopublish
package, ainsi que de faire un correspondantMeteor.publish
fonction sur le serveur. Tout cela peut paraître fastidieux, vous pourriez finir par le faire de toute façon à donner à vos utilisateurs de leurs propres listes &/ou mettre en œuvre une sorte de sécurité.Suggéré des modifications à votre code:
Vous faites DOM traversant la place,
Template.mytemplate.onRendered(function()..
mais vous avez aussi besoin de s'accrocher dans Google Maps API de capture lorsque leur carte est terminée dessin. Vous devez également utiliserMeteor.subscribe
pour vous assurer d'obtenir le bon timing et ne pas senull
/undefined
.Assurez-vous de mettre votre Modèle d'assistance dans un
Meteor.isClient
mais pas dans unMeteor.startup
parce que Meteor.le démarrage est déclenché une fois que votre initiale DOM est prêt (le intitial est le premier, mais avant que son modifié par le réactif de variables ou d'un routeur) afin que votre modèle de définitions doivent exécuter avant ce stade.Il ne devrait pas vraiment être beaucoup de peine si, d'obtenir les coordonnées n'est pas si cher que ça une opération, vous pourriez probablement aller avec des milliers mais alors votre carte aurait trop de broches 😛
En fait au lieu de numériser les DOM pour obtenir des données d'attributs, je serais mieux d'obtenir la latitude et la longitude directement à partir de ma Collection.. mais je pense que c'est une autre question:) Une question pour vous réponse: Alors, après tout, dois-je les mettre en abonnez-vous de rappel ou en .rendu?:)
Si vous voulez dire la getMarkers() et vous allez utiliser la collection au lieu de le DOM utilisation vous abonner, il serait moins pénible si vous êtes inquiet à ce sujet (comme sur les appareils mobiles)
Oui il l'est! J'ai mis à jour la réponse à cette fin.
OriginalL'auteur Akshat
La raison pour laquelle il renvoie
null
comme un résultat est, vous l'avez placé dansMeteor.startup()
. Il va effectivement avant le chargement des données à partir du serveur. Ainsi, lelists.find()
renvoie la valeur null.La
Meteor.startup()
est un endroit pour initialiser vos variables globales, reative sessions et en souscrivant à la primaire tas de données à partir du serveur. Tout ce que vous écrivez là est exécutée une seule fois, juste après que le client démarre.La
Template.myTemplate.rendered()
est un spécial helper fournis par le météore qui s'exécute à chaque fois au moment où les données ont changé, il est principalement utilisé pour l'obtention d'attributs ou de la manipulation de DOM éléments contenus à l'intérieur de ce modèle.Placez votre assistant code à l'extérieur en commun
isClient()
zone. Et l'utilisation.rendered()
de l'aide pour traverser le DOM, et d'obtenir ou de manipuler les attributs des éléments du DOM.Une chose de plus, selon les docs.meteor Meteor.de démarrage "Sur un client, la fonction sera exécutée dès que le DOM est prêt et tout <body> les modèles à partir de votre .html fichiers ont été mis à l'écran." donc le contraire de ce que vous dites..
OriginalL'auteur sohel khalifa
Merci beaucoup Akshat pour la réponse détaillée)
J'ai plus compliqué cas de l'utilisation d'un Météore.abonnez-vous, j'ai le modèle qui comprend des images de DB. J'ai donc besoin d'attendre que les données à partir de deux de collecte des iamges et nouvelles(toutes les autres données ici).
- Je obtenir mon DOM prêt de cette façon:
Structure du modèle:
Pour info je pense que cette solution n'est pas réactif de l'environnement. Il fonctionne sur la première charge, mais si des images ou des nouvelles obtenir de manière réactive à jour (ajout ou suppression), le plugin ne sera pas mise à jour. Vous aurez besoin d'ajouter une maçonnerie de recyclage au niveau de la tête sur le
onRendered
OriginalL'auteur Gleb Dolzikov
La meilleure façon de le faire est de mettre le code dans le Modèle.x.rendu() et utiliser une Session réactive variable pour vérifier si le code a été exécuté ou non. Par exemple, vous pouvez aller à ce sujet comme suit:
Si jamais vous voulez relancer cette partie du code, vous n'avez qu'à appeler:
OriginalL'auteur Swadq