javascript - Binding an array of objects to template containing google-map-marker elements -
i have <dom-module>
property locations
of type array updated externally every once in while:
<dom-module id="my-map"> <template> <google-map api-key="my_api_key" id="map" libraries="visualization,geometry,drawing"> <template is="dom-repeat" items="{{locations}}" as="user"> <template is="dom-repeat" items="{{user.trace}}"> <google-map-marker latitude="{{item.latitude}}" longitude="{{item.longitude}}"> </google-map-marker> </template> </template> </google-map> </template> </dom-module> <script> polymer({ : 'my-map', properties : { locations : { type : array, value : [], observer : '_locationschanged' } }, ready : function(){ var self = this; this.map = this.queryselector('google-map'); this.map.addeventlistener('google-map-ready',function(){ // styling happening here. }); }, _locationschanged : function(newlocations, oldlocations){ // fires correctly! ... } }); </script>
in module, send ajax request retrieve data shown markers on map. once request finishes, update locations property , _locationschanged
callback fires fine.
the data in case looks this:
[ { "_id":"someid1", "trace":[ { "latitude":55.629215086862, "longitude":10.640099246067, } ] }, { "_id":"someid2", "trace":[ { "latitude":50.14743798944287, "longitude":18.52913082363756, } ] } ]
something weird happens.
whenever locations empty array, newlocations
bound without problems <template dom-repeat="{{locations}}">
element. however, if map had shown couple of markers, old <google-map-marker>
objects still there, new ones added. if in dev console document.queryselectorall('google-map-marker')
after update locations
, see both newlocations
and oldlocations
.
to test data-binding works correctly if applied outside <google-map>
element, added similar template. here, works expected:
<template is="dom-repeat" items="{{locations}}" as="user"> <ul> <li> <span>{{user._id}}</span> <ul> <template is="dom-repeat" items="{{user.trace}}" as="trace"> <li><span>lat:</span><span>{{trace.latitude}}</span></li> </template> </ul> </li> </ul> </template>
here's did not far:
- calling
clear()
on googlemap object. - creating second property bound dom-repeat template, accessed this way:
this.splice('_locations',0,this._locations.length); newlocations.foreach(function(location){ self.push('_locations',location); });
- using one-way data binding.
- manually removing dom nodes via
googlemap.removechild(marker)
, adding them. okay, worked degree isn't whole point of data-binding don't have this?
so, sum up: <template is="dom-repeat">
inside google map does not notified correctly changes locations
property. can tell me i'm doing wrong or if data-binding not work inside <google-map>
element? mixing things shady / shadow dom? using dom-repeat thing incorrectly? going lose mind? i'll appreciate hint towards solution. thanks!
i not sure if makes difference specific problem default values arrays , objects should specified in format (see value attribute) :
properties : { locations : { type : array, value : function() { return [];}, observer : '_locationschanged' } },
i think have call clear()
on google-map
element because _updatemarkers()
function not (see here)
Comments
Post a Comment