我很难理解为什么this.$map
和this.markers
未定义。这是我正在使用的代码,我添加了注释,我希望这些变量提供一个值:
(function($) {
'use strict';
var A = {
/**
* Initialize the A object
*/
init: function() {
this.$map = this.renderMap();
this.markers = this.getMarkers();
this.renderMarkers();
},
renderMap: function() {
var url = 'http://a.tiles.mapbox.com/v3/delewis.map-i3eukewg.jsonp';
// Get metadata about the map from MapBox
wax.tilejson(url, function(tilejson) {
var map = new L.Map('map', {zoomControl: false});
var ma = new L.LatLng(42.2625, -71.8028);
map.setView(ma, 8);
// Add MapBox Streets as a base layer
map.addLayer(new wax.leaf.connector(tilejson));
return function() {
return map;
};
});
},
renderMarkers: function() {
var geojsonLayer = new L.GeoJSON(null, {
pointToLayer: function (latlng){
return new L.CircleMarker(latlng, {
radius: 8,
fillColor: "#ff7800",
color: "#000",
weight: 1,
opacity: 1,
fillOpacity: 0.8
});
}
});
geojsonLayer.addGeoJSON(this.markers); // this.markers is undefined
this.$map.addLayer(geojsonLayer); // this.$map is undefined
},
getMarkers: function() {
$.getJSON("/geojson/", function (data) {
return data;
});
}
};
/**
* A interactions
*/
$(document).ready(function() {
A.init()
});
})(jQuery.noConflict());
我花了很多时间搜索,我觉得我在这里缺少一些基本的东西,但我不明白。
答案 0 :(得分:3)
renderMap
和getMarkers
方法均未返回任何值,因此其返回值为undefined
。
看起来你正试图从ajax请求初始化这些字段,这不一定是个好主意。
你可能应该做的事情是:
getMarkers: function(callback){
var result = this;
$.getJSON("url", function(jsonData){
result.markers = jsonData;
if(callback) callback()
});
},
会在对象变为可用时懒洋洋地初始化对象的字段。
NB :AJAX 异步您无法快速依赖此回调设置该成员,或者确实曾经(可能会失败)。 这表明你需要多考虑一下你的设计,并尝试更多地使用回调。
e.g。修改上面的getMarkers
和renderMap
函数,以获取在存储数据后调用的回调,然后将init更改为:
init: function(){
var res = this;
var post_init_callback = function(){
if(res.$map != undefined && res.markers!=undefined){
//this will only run after both ajax calls are complete
res.renderMarkers();
}
};
this.getMarkers(post_init_callback);
this.renderMap(post_init_callback);
},
答案 1 :(得分:1)
这里的问题是你在另一个函数中调用return。你实际上在做的是定义getMarkers
(最简单的例子):
getMarkers: function() {
$.getJSON('/geojson/', some_random_func);
}
此时,getMarkers实际上并没有返回任何内容(ergo undefined)。您的renderMap函数也是如此。同样在这种情况下,你的“some_random_func”被定义为function(data) { return data; }
,但它将它返回给什么?事实上,some_random_func
是由jQuery本身调用的,而AFAIK jQuery根本不关心它的成功函数的返回值。