0

如何每次单击“创建新多边形”按钮时,将最后一个对象存储在数组中并创建一个新的干净对象以在地图上绘制新的分离折线。我想保留旧折线的功能。现在无法清洁物体。简化示例如下所示。

HTML:

<button onclick="create()">Create New Poly</button>
<div id="map" style="width: 500px; height: 400px;"></div>

JS:

var map;
var listener;

var polys = [],
    poly = {};

create = function() {
    poly = new Poly();

    if ( !! listener) google.maps.event.removeListener(listener);
    listener = google.maps.event.addListener(map, 'click', function(e) {
        poly.addPoint(e.latLng);
    });
}

function Poly() {
    this.markers = [];
    this.setMap(map);
    polys.push(this);
}
Poly.prototype = new google.maps.Polyline();

Poly.prototype.addPoint = function(p) {
    var m = poly.createMarker(p);
    poly.markers.push(m);
    poly.getPath().push(p);
}

Poly.prototype.createMarker = function(p) {
    var marker = new google.maps.Marker({
        position: p
    });
    marker.setMap(this.getMap());
    return marker;
}

$(function() {
    map = new google.maps.Map(document.getElementById('map'), {
        center: new google.maps.LatLng(48.864715, 10.546875),
        zoom: 4,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });
});

演示:JSFIDDLE

4

2 回答 2

2

即使按照 Ben Davis 的建议http://jsfiddle.net/LxGmR/,它仍然存在问题。

我认为这是由于所有 Ploy 对象共享相同的原型:Poly.prototype = new google.maps.Polyline();. 我认为解决方法是每个新Ploy对象都需要自己的原型google.maps.Polyline实例。

经过测试,我发现这是真的:http: //jsfiddle.net/uhZFE/

然后我查找了如何在没有包装函数的情况下执行此操作,我使用了 SO 答案https://stackoverflow.com/a/6519265/388787中描述的方法(http://javascript.crockford.com/prototypal.html是也很有帮助)并制作了http://jsfiddle.net/YgSwF/,如下所示;它按您的要求工作:

var map;
var listener;

var polys = [];

create = function () {
  var poly = new Poly();

  if ( !! listener) google.maps.event.removeListener(listener);
  listener = google.maps.event.addListener(map, 'click', function (e) {
    poly.addPoint(e.latLng);
  });
  polys.push(poly);
}

function Poly() {
  google.maps.Polyline.call(this);
  this.markers = [];
  this.setMap(map);
}
Poly.prototype = Object.create(google.maps.Polyline.prototype);

Poly.prototype.addPoint = function (p) {
  var m = this.createMarker(p);
  this.markers.push(m);
  this.getPath().push(p);
}

Poly.prototype.createMarker = function (p) {
  var marker = new google.maps.Marker({
    position: p
  });
  marker.setMap(this.getMap());
  return marker;
}

$(function () {
  map = new google.maps.Map(document.getElementById('map'), {
    center: new google.maps.LatLng(48.864715, 10.546875),
    zoom: 4,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });
});​
于 2012-05-23T00:21:40.067 回答
1

我相信您的问题与变量范围有关。您应该在 create() 函数中声明 poly。另外,我认为在 create() 函数中将创建的对象推送到数组中以遵守关注点分离会更有意义。

此外,在您的 addPoint() 函数中,当您应该使用“this”时,您指的是全局 poly 变量。

更新代码:

var map;
var listener;

var polys = [];

create = function() {
    var poly = new Poly();

    if ( !! listener) google.maps.event.removeListener(listener);
    listener = google.maps.event.addListener(map, 'click', function(e) {
        poly.addPoint(e.latLng);
    });
    polys.push(poly);
}

function Poly() {
    this.markers = [];
    this.setMap(map);
}
Poly.prototype = new google.maps.Polyline();

Poly.prototype.addPoint = function(p) {
    var m = this.createMarker(p);
    this.markers.push(m);
    this.getPath().push(p);
}

Poly.prototype.createMarker = function(p) {
    var marker = new google.maps.Marker({
        position: p
    });
    marker.setMap(this.getMap());
    return marker;
}

$(function() {
    map = new google.maps.Map(document.getElementById('map'), {
        center: new google.maps.LatLng(48.864715, 10.546875),
        zoom: 4,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });
});​
于 2012-05-23T00:03:17.087 回答