javascript - 在 Forge Viewer 中第二次之后扩展不会加载

标签 javascript reactjs typescript autodesk-forge

我使用 Reactjs 开发 Forge Viewer。

当我在 Forge Viewer 中显示绘图时,第二次后扩展程序不会加载。

未加载的扩展。

Autodesk.ViewCubeUi.
Autodesk.BimWalk.
Autodesk.Measure.
Autodesk.Section.
Autodesk.LayerManager.

在当前实现中,每次绘图文件更改时都会重新加载查看器脚本。

我通过引用实现了这个脚本。

https://github.com/outer-labs/react-forge-viewer

我该如何解决这个问题?

错误日志(这是 ViewCubeUi 错误,但其他扩展也是如此。)

Uncaught (in promise) Error: Extension not found: Autodesk.ViewCubeUi. Has it been registered(3)?
    at VM26450 viewer3D.min.js:19
(anonymous) @ viewer3D.min.js?v=v7.18:19
Promise.then (async)
loadExtension @ viewer3D.min.js?v=v7.18:19
(anonymous) @ viewer3D.min.js?v=v7.18:24
setTimeout (async)
T.createUI @ viewer3D.min.js?v=v7.18:24
(anonymous) @ viewer3D.min.js?v=v7.18:24
(anonymous) @ viewer3D.min.js?v=v7.18:24
setTimeout (async)
(anonymous) @ viewer3D.min.js?v=v7.18:24
p @ viewer3D.min.js?v=v7.18:19
(anonymous) @ viewer3D.min.js?v=v7.18:24
l @ viewer3D.min.js?v=v7.18:24
(anonymous) @ viewer3D.min.js?v=v7.18:24
forEach.e.<computed> @ viewer3D.min.js?v=v7.18:24
x @ viewer3D.min.js?v=v7.18:24
a @ viewer3D.min.js?v=v7.18:24
Promise.then (async)
x @ viewer3D.min.js?v=v7.18:24
a @ viewer3D.min.js?v=v7.18:24
(anonymous) @ viewer3D.min.js?v=v7.18:24
(anonymous) @ viewer3D.min.js?v=v7.18:24
(anonymous) @ viewer3D.min.js?v=v7.18:24
i @ viewer3D.min.js?v=v7.18:19

代码

查看器脚本加载如下。 <ForgeViewer />组件显示绘图并处理查看器事件。

const version = "7.18"
const cssUrl = `https://developer.api.autodesk.com/modelderivative/v2/viewers/style.min.css?v=v${version}`
const scriptUrl = `https://developer.api.autodesk.com/modelderivative/v2/viewers/viewer3D.min.js?v=v${version}`

import React, {useState, useEffect} from 'react'

interface ScriptLoaderProps {
  url: string
  onLoad?: () => void
  onError?: () => void
}

const ScriptLoader: React.FC<ScriptLoaderProps> = ({url, onLoad, onError, children}) => {
  const [ready, setReady] = useState(false)
  useEffect(() => {
    const script = document.createElement('script')
    script.src = url
    script.async = true
    script.onload = () => {
      setReady(true)
      if(onLoad) onLoad()
    }
    if(onError) script.onerror = onError
    document.body.appendChild(script)
    return () => {
      document.body.removeChild(script)
    }
  }, [url])
  if(ready) return <>{children}</>
  return <></>
}

const Viewer = () => {
  return(
    <>
      <link rel="stylesheet" type="text/css" href={cssUrl} />
      <ScriptLoader url={scriptUrl}>
        <ForgeViewer />
      </ScriptLoader>
    </>
  )
}

  • Chrome 81.0.4044.138(官方版本)(64 位)
  • 查看器版本:7.18

最佳答案

尽量不要重新加载查看器脚本,否则您可能会在加载扩展和其他一些依赖项时遇到奇怪的冲突(或更准确地说,根据我们的工程,这是一个深层的竞争条件)...

这个问题从早期的 v7 版本开始就存在......

实际上,创建自己的查看器组件并查看示例非常简单 here - 处理多个组件并重新加载时,只需使用状态控制机制(redux 等)来检查库是否已加载/正在加载以避免冲突...

或者您可以自定义此组件(虽然我们不完全支持,因为它是第 3 方),以在尝试加载脚本之前检查 window.Autodesk 是否已经可用...

关于javascript - 在 Forge Viewer 中第二次之后扩展不会加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61885753/

相关文章:

node.js - 在 firebase 中看不到请求 header 的值?

javascript - 如何在返回值之前等待 Cypress then() 命令完成?

css - ReactJS 样式组件的上下文样式

用于删除图像的 Javascript 代码

javascript - :gt counting from last position

javascript - (Javascript) 按钮没有更新

javascript - 当组件更新 props 时点击 DOM 元素

javascript - 当函数在构造函数中绑定(bind)时如何在 ES6 React 中向事件处理程序添加参数

javascript - 引用包含点的 json 字段名称

javascript - 在鼠标上定位 div