我有一个<li>
使用 Meteor.startup 填充 find() 的列表,如下所示。然后我<li>
使用 data() 获取这些的所有数据属性并将其放入一个对象中并尝试 return/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());
}
});
});
});
});
上面的代码在 Meteor.Startup 中创建了一个新的谷歌地图(使用 GMaps.js 插件),然后在嵌套的订阅中从集合中获取所有文档,forEaches 结果并获取纬度和经度值,然后继续添加谷歌地图上的标记...
编辑 2
我以这种方式将我的“地图”变量设为全局变量,无需嵌套 .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;
}