首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误TypeError:无法读取未定义的属性“_leaflet_pos”

错误TypeError:无法读取未定义的属性“_leaflet_pos”
EN

Stack Overflow用户
提问于 2021-02-02 11:41:10
回答 1查看 4.6K关注 0票数 1

我有角10应用程序使用ngx-传单和路由。我有一个地图组件,它根据用户选择动态显示地图上的自定义标记。我从map组件视图导航到另一个组件。然后我导航回映射组件。用户可以更改日期,并在此基础上删除旧的标记层,并加载和显示新的标记层。一切都很好,但我总是会遇到这样的错误:

代码语言:javascript
复制
ERROR TypeError: Cannot read property '_leaflet_pos' of undefined
at getPosition (leaflet-src.js:2450)
at NewClass._getMapPanePos (leaflet-src.js:4439)
at NewClass._moved (leaflet-src.js:4443)
at NewClass.getCenter (leaflet-src.js:3798)
at NewClass.setZoom (leaflet-src.js:3181)
at SafeSubscriber._next (map.component.ts:960)
at SafeSubscriber.__tryOrUnsub (Subscriber.js:183)
at SafeSubscriber.next (Subscriber.js:122)
at Subscriber._next (Subscriber.js:72)
at Subscriber.next (Subscriber.js:49)

只有当我返回到map组件时,我才能再现此错误。如果我只停留在map组件中,则不会显示错误。我已经搜索了修复程序,但从我发现的情况来看,似乎没有人真正知道为什么会发生这种情况,也不知道如何修复这个错误。我在GitHub上发现了这两个问题,它们在Vue.js中处理相同的问题,所以我猜这是传单本身的问题,而不是ngx传单。

https://github.com/vue-leaflet/Vue2Leaflet/issues/613

https://github.com/stefanocudini/leaflet-search/issues/129

我试着改变这一点:

代码语言:javascript
复制
  function getPosition(el) {
// this method is only used for elements previously positioned using setPosition,
// so it's safe to cache the position for performance

return el._leaflet_pos || new Point(0, 0);

}

对此:

代码语言:javascript
复制
 function getPosition(el) {
// this method is only used for elements previously positioned using setPosition,
// so it's safe to cache the position for performance

if(el){
    return el._leaflet_pos || new Point(0, 0);
    }
    else{
    return new Point(0, 0);
    }

}

但是,错误就像这样:

代码语言:javascript
复制
ERROR TypeError: Cannot set property '_leaflet_pos' of undefined
at setPosition (leaflet-src.js:2433)
at NewClass._resetView (leaflet-src.js:4154)
at NewClass.setView (leaflet-src.js:3174)
at NewClass.setZoom (leaflet-src.js:3186)
at SafeSubscriber._next (map.component.ts:960)
at SafeSubscriber.__tryOrUnsub (Subscriber.js:183)
at SafeSubscriber.next (Subscriber.js:122)
at Subscriber._next (Subscriber.js:72)
at Subscriber.next (Subscriber.js:49)
at MapSubscriber._next (map.js:35)

更新: As @pk。在注释中建议,当我在删除旧标记之前不调用setZoom或调用它时,就会得到以下错误:

代码语言:javascript
复制
ERROR TypeError: Cannot read property 'appendChild' of undefined
at NewClass._initIcon (leaflet-src.js:7608)
at NewClass._initIcon (leaflet.rotatedMarker.js:23)
at NewClass.onAdd (leaflet-src.js:7460)
at NewClass._layerAdd (leaflet-src.js:6572)
at NewClass.whenReady (leaflet-src.js:4433)
at NewClass.addLayer (leaflet-src.js:6634)
at NewClass.eachLayer (leaflet-src.js:6861)
at NewClass.onAdd (leaflet-src.js:6845)
at NewClass._layerAdd (leaflet-src.js:6572)
at NewClass.whenReady (leaflet-src.js:4433)

更新2:当我不添加新的标记层到地图(this.deskLayer.addTo(地图)),错误解除,但我想添加新的标记来映射.当用户更改日期时,会发生这样的情况:

代码语言:javascript
复制
onMapReady(map: Map) {

//listening for USER DATE CHANGE
this.userFloorService.sharedUserSelectedDate
  .pipe(skip(1))
  .subscribe(() => {
    this.deskLayer.remove(); // first remove old desks
    this.userFloorService // then get desks and reservations
      .getFloor(this.floorNumber)
      .subscribe( (data) => { 
        // create new reservations
        let reservationsArr = data.records[0].reservations;
        // create new DESKS
        let deskMarkers = [];
        data.records[0].desks.forEach((desk) => {
          let deskId = desk.desk_id;
          let deskMarker = marker(
            [
              desk.desk_coordinate.coordinates[0],
              desk.desk_coordinate.coordinates[1],
            ],
            {
              title: this.getDeskTitle(desk, reservationsArr), // set desk title to RESERVED/FREE
              rotationAngle: desk.desk_angle,
              rotationOrigin: 'center center',
              riseOnHover: true
            }
          ).on('click', () => {
            this.zone.run(() => {
              this.openDeskDialog(deskMarker.options.title,deskId); 
            });
          });
          deskMarker.setIcon(this.getDeskIcon(deskMarker)); // for displaying desk icons on zoomLvl -1.5
          deskMarkers.push(deskMarker);
        });
        this.deskLayer = layerGroup(deskMarkers); // add new desks to deskLayer
        this.layersControl.overlays['Desks'] = this.deskLayer; // reassign desks in overlays for correct desk layer toggling 

        this.deskLayer.addTo(map); 
        map.setZoom(-1); // set zoom
      },
      error =>{
        console.log(error);
      }
      ); 
  });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-11 11:35:07

事实证明,这些错误的发生是因为我使用BehaviorSubject在组件之间传递数据,每次我导航和返回到map组件时,都会创建对BehaviorSubject的新订阅,而不会破坏旧的订阅。因此,每次我从地图组件导航时都会销毁订阅,从而解决这个问题。也许这会对某人有帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66009013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档