在我的应用程序中,我有一个路径map.svelte
它有两个子组件:Map.svelte和LayerSelector.svelte
Map.svelte创建一个OpenLayers map实例。LayerSelector.svelte需要访问此实例。
我在map.svelte中声明了map实例,并将其绑定到两个组件,但似乎无法在LayerSelector.svelte中访问它
map.svelte:
<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:
export let map = null;
...
onMount(async () => {
map = await initMap ('map', organisation, meta, startCoords);
});
...initMap.js
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:
<script>
export let map
</script>
{#each map.getLayers() as layer}
<p>{layer.get('name')}</p>
{/each}我可能会错在哪里?我是否需要将OpenLayers map实例放在一个可写的存储区中?
发布于 2021-10-09 18:32:05
就其本身而言,您的代码应该可以工作。您可以像这样将变量双向绑定到两个单独的子组件,然后让其中一个组件对其进行初始化。
我创建了一个REPL that illustrates that it's possible。
当你说你不能访问这个变量时,你是什么意思?你得到一个意想不到的值或一个错误?
我怀疑您遇到的问题是map在onMount运行之前会有一段时间处于undefined状态。如果未设置map,则LayerSelector将抛出错误。
如果这就是问题所在,那么用map ? map.getLayers() : []替换map.getLayers()就可以解决这个问题。
也就是说,拥有大量的双向绑定会导致数据流不明确。我会考虑在map.svelte中初始化变量,然后简单地将其传递给其他组件,以稍微简化数据流。
https://stackoverflow.com/questions/69508229
复制相似问题