У меня есть список <li>
, который заполняется с помощью find(), используя Meteor.startup, как вы видите ниже. Затем я получаю все атрибуты данных этих <li>
с помощью data() и помещаю их в объект и пытаюсь вернуть /console.log, чтобы я мог видеть, работает ли он. Но я получаю 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;
}
Я попробовал то же самое в своей консоли напрямую, и он работает - я возвращаю объект обратно, поэтому я предполагаю, что DOM не готов/не заполнен до того, как эта функция будет выполнена.
Мне трудно понять разницу между такими вещами, как Meteor.startup и Template.mytemplate.rendered. В этом случае кажется, что никто из них не работает так, как я хочу?
Каков правильный способ/место для работы с DOM (перемещение, получение атрибутов, манипулирование)?
изменить
так как код сильно изменился, чтобы сделать то, что я хотел, я опубликовал все это.
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());
}
});
});
});
});
Вышеприведенный код создает новую карту google (с использованием плагина GMaps.js) внутри Meteor.Startup, а затем во вложенной подписке извлекает все документы из коллекции, для получения результатов и получения значений широты и долготы, затем идет для добавления маркеров в карту google...
изменить 2
Я сделал свою переменную "map" глобальной, поэтому не нужно встраивать .subscribe и .startup.
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;
}