Typescript 为什么场景视图渲染不正确

Typescript 为什么场景视图渲染不正确,typescript,arcgis-js-api,Typescript,Arcgis Js Api,我正在学习ArcGIS JS Api 4.x版,并认为实现一个小部件是对Typescript和小部件体系结构的一个很好的练习,它在当前的地图视图上显示一个场景视图 /// <amd-dependency path="esri/core/tsSupport/declareExtendsHelper" name="__extends" /> /// <amd-dependency path="esri/core/tsSupport/decorateHelper" name="__d

我正在学习ArcGIS JS Api 4.x版,并认为实现一个小部件是对Typescript和小部件体系结构的一个很好的练习,它在当前的
地图视图
上显示一个
场景视图

/// <amd-dependency path="esri/core/tsSupport/declareExtendsHelper" name="__extends" />
/// <amd-dependency path="esri/core/tsSupport/decorateHelper" name="__decorate" />

import EsriMap from 'esri/Map';
import SceneView = require("esri/views/SceneView");

import { aliasOf, declared, property, subclass } from "esri/core/accessorSupport/decorators";

// building Widgets
import Widget = require("esri/widgets/Widget");
import { accessibleHandler, renderable, cssTransition, tsx } from "esri/widgets/support/widget";


// CSS class lookup object
const CSS = {
    base: "app-sceneView",
    iconClass: "esri-icon-layer-list"
};

@subclass("Widgets.SceneViewWidget")
export default class SceneViewWidget extends declared(Widget) {

    constructor(params?: any) {
        super();
    }

    //icon class for the expand widget(!)
    @property()
    iconClass = CSS.iconClass;

    map: EsriMap = null;

    _bindView() {
        const view = new SceneView({
            map: this.map,
            container: "sceneView-container"
        });
    }

    render() {
        return <div id="sceneView-container" class={CSS.base} afterCreate={this._bindView}></div>
    }
}

如你所见。div的边界在那里,控件被渲染,属性也在那里。只缺少SceneView本身。这是为什么?

在上面的TypeScript代码中没有呈现的原因是
中的
这个.map
是空的,因为
这个
是函数,而不是对象范围

_bindView() {
  new SceneView({
    map: this.map,
    container: "sceneView-container"
  });
}
可以通过在
render()
中传递一个范围正确的
\u bindView()
函数来修复此问题:

  • 为传递一个有效值,例如
  • 为和提供单独的实例,避免两个视图相互干扰。只需使用
    新EsriMap(…)
    创建一个新的


这是css问题吗?@BelowtheRadar不太可能。控件显示为灰色,而图像外部的“地图视图”控件显示为黑色线条。我倾向于一个生命周期问题,将场景视图转换为普通地图是完美的。我特别尝试在小部件的生命周期内连接一个,这就是失败的原因。您是否尝试在render()函数中的附加函数中包装sceneViewer容器元素?e、 我做了,但它没有任何视觉效果。如此简单,但绝对惊人。你该喝杯啤酒。
_bindView() {
  new SceneView({
    map: this.map,
    container: "sceneView-container"
  });
}
render() {
  return <div afterCreate={this._bindView.bind(this)} id="sceneView-container" class={CSS.base}></div>;
}
render() {
  return <div afterCreate={() => this._bindView()} id="sceneView-container" class={CSS.base}></div>;
}
<div><div id="sceneView-container" class={CSS.base} afterCreate={this._bindView.bind(this)}></div></div>
const map = new EsriMap({
  basemap: "streets",
  ground: "world-elevation"
});