首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写两个组件以访问同一对象

编写两个组件以访问同一对象
EN

Stack Overflow用户
提问于 2021-10-09 15:40:00
回答 1查看 79关注 0票数 1

在我的应用程序中,我有一个路径map.svelte

它有两个子组件:Map.svelteLayerSelector.svelte

Map.svelte创建一个OpenLayers map实例。LayerSelector.svelte需要访问此实例。

我在map.svelte中声明了map实例,并将其绑定到两个组件,但似乎无法在LayerSelector.svelte中访问它

map.svelte:

代码语言:javascript
复制
<script>
  import Map from '../components/Map.svelte';
  import MapLayerSelectorDialog from '../components/LayerSelector.svelte';
  let map;
</script>

<div class="map" id="map">
 <Map organisation={organisation} meta={meta} 
  showBackControl="true" showEditControl="true" showSearchControl="true"
  bind:map={map}
  on:mapready={initLayerSelector(map)}
  on:map-back={back=goBack}
  on:featureselected={featureSelected}
  on:togglelayerselector={toggleLayerSelector}
  on:togglemapsearch={toggleMapSearch}
  on:togglemapeditcontrol={toggleMapEdit}
 />
</div>

<MapLayerSelectorDialog bind:showDialog={showLayerSelectorDialog}
  bind:meta = {meta}
  bind:map={map}>
</MapLayerSelectorDialog>

Map.svelte:

代码语言:javascript
复制
export let map = null;
...
onMount(async () => {
  map = await initMap ('map', organisation, meta, startCoords);
});
...

initMap.js

代码语言:javascript
复制
export async function initMap (div, organisation, meta, startCoords) {
  var map = new Map({
    target: div, //'map',
    view: new View({
      center: fromLonLat ([1330601.87, 7916443.12]),
      zoom: 12,
    }),
  });
  addLayers (map, meta);
});

LayerSelector.svelte:

代码语言:javascript
复制
<script>
export let map
</script>
{#each map.getLayers() as layer}
  <p>{layer.get('name')}</p>
{/each}

我可能会错在哪里?我是否需要将OpenLayers map实例放在一个可写的存储区中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-09 18:32:05

就其本身而言,您的代码应该可以工作。您可以像这样将变量双向绑定到两个单独的子组件,然后让其中一个组件对其进行初始化。

我创建了一个REPL that illustrates that it's possible

当你说你不能访问这个变量时,你是什么意思?你得到一个意想不到的值或一个错误?

我怀疑您遇到的问题是maponMount运行之前会有一段时间处于undefined状态。如果未设置map,则LayerSelector将抛出错误。

如果这就是问题所在,那么用map ? map.getLayers() : []替换map.getLayers()就可以解决这个问题。

也就是说,拥有大量的双向绑定会导致数据流不明确。我会考虑在map.svelte中初始化变量,然后简单地将其传递给其他组件,以稍微简化数据流。

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

https://stackoverflow.com/questions/69508229

复制
相关文章

相似问题

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