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

标签 google-maps knockout.js observable subscribe

我有一个带有一些标记的 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/

相关文章:

asp.net - Signalr 在 IIS 7.5 和 Edge/IE 中错误地反序列化我的对象,foreverFrame 损坏了?

javascript - 创建可观察量,将其他可观察量作为单个映射返回

Swift:MapKit 或 Google map 上特定位置的速度限制?

javascript - knockout : XXX is not a function error

javascript - 在值变化时加载新的信息窗口

javascript - Knockout.js:对表和 foreach 中的分组值求和

java - 在可观察对象发出一定数量的项目后触发一个 Action

javascript - RxJS Observable 轮询直到条件为 true

android - 如何在android中动态地给map api key

java - 我可以从一个外部库导入和编辑代码吗? (例如谷歌地图实用程序)