gpt4 book ai didi

google-maps - 在 knockoutjs 中订阅 observableArray 的最简单方法

转载 作者:行者123 更新时间:2023-12-02 02:02:34 25 4
gpt4 key购买 nike

我有一个带有一些标记的 observableArray,例如:

var markers = ko.observableArray([
{
id: 0,
title: ko.observable("Marker 0"),
lat: ko.observable(55.31),
lng: ko.observable(11)
},
{
id: 1,
title: ko.observable("Marker 1"),
lat: ko.observable(57.20),
lng: ko.observable(15.5)
}
]);

这个数组被发送到一些 MapWidget 对象,它必须为每个元素创建谷歌地图标记。它必须移动标记以防 lat、lng observables 发生变化,更改标记的标题以防标题 observable 发生变化等等。

这意味着在 MapWidget 中有一些 googlemap 标记数组,它应该与给定的 observableArray 连接。连接它们的最佳和最简单的方法是什么?

更新。有关 MapWidget 的更多详细信息。

MapWidget 是一些可以访问某些 google maps map 对象的对象,它接收一个带有标记的 observableArray 作为参数,如上所示。

var MapWidget = function(markers) {
var div = $("#map").get(0);
this.map = new gmaps.Map(div);
/*
The magic goes here:
markers is an observableArray, we subscribe for it's changes,
create gmaps.marker for each new element,
destroy in case of destroying them from array,
move and rename each marker in case of corresponding changes
*/
}

最佳答案

你可以像这样订阅你的数组:

ar.subscribe(function() {
// clean and redraw all markers
});

如果你这样做,当一个项目被添加到数组中/从数组中删除时,你会收到一个通知。但不是在修改项目的属性时。

如果您想根据项目中的个别属性更改更新您的谷歌地图标记,您可以实现 simple dirty flag mechanism然后单独订阅每个项目。由于每个项目都有一个 id,我认为它是唯一的,因此您可以创建一个 map ,其中键/值对是 id 和 map 小部件。

因此,给定每个单独的项目:

var item = function(data) {
var self = this;
self.isChanged = ko.observable(self);
self.id = data.id;
self.title = ko.observable(data.title);
self.title.subscribe(function() { self.isChanged(self); self.isChanged.valueHasMutated(); });
self.lat = ko.observable(data.lat);
self.lat.subscribe(function() { self.isChanged(self); self.isChanged.valueHasMutated(); });
self.lng = ko.observable(data.lng);
self.lng.subscribe(function() { self.isChanged(self); self.isChanged.valueHasMutated(); });
}

并给定一张假设 map ,您可以在其中保持标记和项目之间的联系:

var markersMap = [];
markersMap[0] = yourGoogleMapWidget;

然后您可以像这样订阅跟踪项目的更改:

ar[0].isChanged.subscribe(function(item) {
var myGMapMarker = markersMap[item.id()];
// update your marker, or destroy and recreate it...
});

关于google-maps - 在 knockoutjs 中订阅 observableArray 的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16482309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com