4

我目前正在开发一个 bing 地图应用程序,当用户单击图钉时,我似乎无法显示信息框。我一直在关注SDK,它应该几乎完全一样。这是我所拥有的:

// ***********************************
// Function creates a single pin
// and returns a reference to the pin

function createMapPin(latLong, sName) {
    var pinImg = "imagespins/Good.png";


var pin = new Microsoft.Maps.Pushpin(latLong, {
    icon: pinImg,
    anchor: new Microsoft.Maps.Point(8, 8),
    draggable: true,
    width: 48,
    height: 48
});

pin.title = sName;


pinInfobox = new Microsoft.Maps.Infobox(pin.getLocation(),
            { title: 'My Pushpin',
                description: 'This pushpin is located at (0,0).',
                visible: false,
                offset: new Microsoft.Maps.Point(0, 15)
            });



// Add handlers for the pushpin events
   Microsoft.Maps.Events.addHandler(pin, 'click', displayInfobox);
// Hide the infobox when the map is moved.
Microsoft.Maps.Events.addHandler(map, 'viewchange', hideInfobox);

map.entities.push(pin);
map.entities.push(pinInfobox);

    return pin;
}

function displayInfobox(e) {
    pinInfobox.setOptions({ visible: true });
}


function hideInfobox(e) {
    pinInfobox.setOptions({ visible: false });
}

引脚成功创建并添加到地图中,当用户单击引脚时,它确实进入了 dispayInfoBox 方法,但消息框似乎没有出现。

任何建议都非常感谢。谢谢!

4

1 回答 1

3

您的代码有效,我已经尝试过了,只要您只调用createMapPin()一次。但是从您的代码来看,您的意图是createMapPin()多次调用,这将导致infobox停止像您想象的那样行为。原因是这一行:

pinInfobox = new Microsoft.Maps.Infobox(pin.getLocation(),
            { title: 'My Pushpin',
                description: 'This pushpin is located at (0,0).',
                visible: false,
                offset: new Microsoft.Maps.Point(0, 15)
            });

由于您没有pinInfobox通过关键字声明为局部变量var,因此它隐式声明为全局变量。我不认为这是你的意图,因为一旦你 createMapPin()再次调用pinInfobox,因为它是一个全局变量,就会被覆盖。所以实际上,即使你继续创建新的信息框,它也只有一个实例,它只是不断地获得分配的新值。因此,如果您单击图钉,则一个信息框可能会在屏幕外某处弹出,而您看不到它。我相信您的意图是让每个图钉关联一个信息框?为此,您需要将信息框声明为局部变量,如下所示:

var pinInfobox = new Microsoft.Maps.Infobox(pin.getLocation(),
        { title: 'My Pushpin',
            description: 'This pushpin is located at (0,0).',
            visible: false,
            offset: new Microsoft.Maps.Point(0, 15)
        });

您还需要修改事件处理程序以与信息框对象的本地版本进行交互,而不仅仅是单个全局变量。最简单的方法是将事件处理程序声明为函数范围内的匿名函数createMapPin(),并使用函数绑定覆盖 this 关键字的含义:

Microsoft.Maps.Events.addHandler(pin, 'click', function (e) {
    this.setOptions({ visible: true });
} .bind(pinInfobox));
Microsoft.Maps.Events.addHandler(map, 'viewchange', function(e) {
    this.setOptions({ visible: false });
}.bind(pinInfobox));

所以这是您更新的代码:

function createMapPin(latLong, sName) {
    var pinImg = "imagespins/Good.png";

    var pin = new Microsoft.Maps.Pushpin(latLong, {
        icon: pinImg,
        anchor: new Microsoft.Maps.Point(8, 8),
        draggable: true,
        width: 48,
        height: 48
    });

    pin.title = sName;

    var pinInfobox = new Microsoft.Maps.Infobox(pin.getLocation(),
        {
            title: 'My Pushpin',
            description: 'This pushpin is located at (0,0).',
            visible: false,
            offset: new Microsoft.Maps.Point(0, 15)
        });

    // Add handlers for the pushpin events
    Microsoft.Maps.Events.addHandler(pin, 'click', function(e) {
        this.setOptions({ visible: true });
    }.bind(pinInfobox));
    // Hide the infobox when the map is moved.
    Microsoft.Maps.Events.addHandler(map, 'viewchange', function(e) {
        this.setOptions({ visible: false });
    }.bind(pinInfobox));
    map.entities.push(pin);
    map.entities.push(pinInfobox);
    return pin;
}
于 2012-04-07T01:29:31.843 回答