【发布时间】:2017-02-12 15:42:22
【问题描述】:
我在 Aurelia 中创建了三个与 Google 地图相关的元素,我以嵌套方式使用它们,其中我有一个基本 GoogleMap 元素,除此之外,我还有一个 GoogleMapLocationPicker 元素和顶部那个一个GoogleMapAutocomplete元素。
这一切都很好,但是我遇到的问题是,当我尝试从我的GoogleMapAutocomplete 元素中访问我的孩子GoogleMap 元素时,我必须将我的代码放入一个任意的setTimeout 或者我尝试访问不存在的属性时出错。
我真的不喜欢在setTimeout 上拍 200 毫秒并希望它永远不会失败,所以我想知道是否有一些官方方法可以知道我的子元素何时加载? (不使用 EventAggregator 作为最后的手段)。
我基本上有这个(请注意代码非常简化,在某些情况下完全不正确,但这仅用于演示目的 - 实际的谷歌地图代码工作正常):
谷歌地图
export class GoogleMap {
@bindable markers;
constructor () {
this.map = new google.maps.Map(this.element);
this.markers.forEach((marker) => {
this.addMarker(marker);
});
}
}
<template>
<div class="google-map"></div>
</template>
google-map-location-picker
export class GoogleMapLocationPicker {
constructor {
this.markers = [{
draggable: true,
dragend: e => {
alert('Nice drag');
}
}];
}
}
<template>
<google-map markers.bind="markers" view-model.ref="map"></google-map>
</template>
google-map-autocomplete
export class GoogleMapAutocomplete {
constructor () {
this.autocomplete = new google.maps.places.Autocomplete();
// This fails unless I wait like 200ms because GoogleMap hasn't yet created its map
this.map.map.map.controls.push(this.autocomplete);
}
}
<template>
<google-map-location-picker view-model.ref="map"></google-map-location-picker>
</template>
更新:
我创建了一个 Plunker 来进一步解释这一点:http://plnkr.co/edit/8fVbjZhJoC8tzAfQOmKP?p=preview
如您所见,应用程序包括 <parent-element>(在我的情况下,这将是 GoogleMapAutocomplete),它反过来又包括 <child-element>(在我的情况下为 GoogleMap)。
子元素做了一些异步操作,只有在完成之后我才能从父元素访问子元素的属性。正如您在parent-element.js 中看到的,试图提醒孩子的财产返回undefined。
我如何从parent-element.js 知道child-element.js 何时完成所有异步工作?
【问题讨论】: