Meteor クライアントで、マップ オブジェクトを定義しました。
Meteor.startup(function () {
map = L.map('map_canvas').locate({setView: true, maxZoom: 21});
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
});
Template.xxxx.events、Template.yyy.rendered...でアクセスできるグローバルとして使用します...(それが最善の方法であるかどうかはわかりません)
だからここまでは大丈夫。
ここで、サーバー側でのみ実行できる地理空間クエリを実行する必要があります。
Meteor.startup(function () {
Meteor.publish("AllMessages", function() {
lists._ensureIndex( { location : "2d" } );
var bottomLeftLat = map.getBounds()._southWest.lat;
var bottomLeftLng = map.getBounds()._southWest.lng;
var topRightLat = map.getBounds()._northEast.lat;
var topRightLng = map.getBounds()._northEast.lng;
return lists.find( { "location": { "$within": { "$box": [ [bottomLeftLng, bottomLeftLat] , [topRightLng, topRightLat] ] } } } );
});
});
しかし、アプリがクラッシュし、次のようになります。
Exception from sub ZeJzWHdF8xQg57QtF ReferenceError: map is not defined
at null._handler (app/server/Server.js:4:25)
at _.extend._runHandler (app/packages/livedata/livedata_server.js:815:31)
at _.extend._startSubscription (app/packages/livedata/livedata_server.js:714:9)
at _.extend.protocol_handlers.sub (app/packages/livedata/livedata_server.js:520:12)
at _.extend.processMessage.processNext (app/packages/livedata/livedata_server.js:484:43)
ロード時間の事ですか?タイムアウトを設定して、クエリを実行する前にマップが読み込まれるまで待つ必要がありますか?
編集これが私が試したもので、うまくいきません
サーバ
Meteor.startup(function () {
Meteor.publish("AllMessages", function() {
lists._ensureIndex( { location : "2d" } );
return lists.find();
});
});
Meteor.methods({
getListsWithinBounds: function(bounds) {
return lists.find( { "location": { "$within": { "$box": [ [bottomLeftLng, bottomLeftLat] , [topRightLng, topRightLat] ] } } } );
}
});
クライアント
Meteor.startup(function () {
map = L.map('map_canvas').locate({setView: true, maxZoom: 21});
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
bounds = {};
map.on('locationfound', function(e){
bounds.bottomLeftLat = map.getBounds()._southWest.lat;
bounds.bottomLeftLng = map.getBounds()._southWest.lng;
bounds.topRightLat = map.getBounds()._northEast.lat;
bounds.topRightLng = map.getBounds()._northEast.lng;
console.log(bounds);
Meteor.call("getListsWithinBounds", bounds, function(err, result) {
console.log('call'+result); // should log a LocalCursor pointing to the relevant lists
});
});
});