3

我有一个带有一些标记的 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 可观察值发生变化,更改标记的标题以防可观察到的标题发生变化等等。

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

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

MapWidget 是一个可以访问某些 google maps 地图对象的对象,它接收一个带有上述标记的 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
  */
}  
4

1 回答 1

2

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

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

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

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

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

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(); });
}

并给出一个假设地图,您可以在其中保持标记和项目之间的链接:

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

然后,您可以订阅跟踪项目的更改,如下所示:

ar[0].isChanged.subscribe(function(item) {
  var myGMapMarker = markersMap[item.id()];
  // update your marker, or destroy and recreate it...
});
于 2013-05-10T12:56:57.003 回答