前端sdk引用问题

本部分内容主要包括引入前端 sdk 的 js 文件时常见的问题。结合客户的具体使用场景,前端 sdk 的使用可分为以下两个部分:1.非组件内使用;2.组件内使用;

以下是具体说明:

# 一、非组件内使用

如无特殊需求,建议在 index.html 中按如下顺序引入 sdk 文件,请确保 ZwInit 方法传入的 dom 元素是正确的(id 名或类名不作限制),此元素将作为 sdk 的容器。

<body>
  <script
    type="text/javascript"
    src="/assets/ZwCloud2DSDK/ZwCloud2D.js"
  ></script>

  <div id="container" style="width: 100vw; height: 100vh"></div>

  <script>
    // 初始化配置
    const initializeViewer = async () => {
      try {
        // 设置云服务连接配置
        ZwCloud2D.ZwDataProcessor.ZwSetConnectUrl(process.env.HTML_APP_ZW_URL);

        // 设置认证令牌
        // 使用Cloud2D公网服务时,需要设置请求token
        // ZwCloud2D.ZwDataProcessor.ZwSetToken(process.env.HTML_APP_ZW_TOKEN);

        // 初始化编辑器
        await ZwCloud2D.ZwEditor.ZwInit(document.getElementById("container"));
      } catch (error) {
        console.error("初始化失败:", error);
        // 可以添加错误处理逻辑
      }
    };

    initializeViewer().then(() => {
      // 设置加载图纸的docId
      ZwCloud2D.ZwDataProcessor.ZwSetLoadDwg(docId);
      // 加载文档
      ZwCloud2D.ZwDataProcessor.ZwLoad();
    });
  </script>
</body>

常见问题:

1.如遇编译报错类似 Module is not defined,Module、ZwCloud2D 均为挂载到 window 上的全局对象,在对应的对象前添加 window 即可解决,如 window.Module、window.Zwcloud2D 等;

2.如遇报错 unexpected token '<',请检查 js 文件引用路径是否正确。如引用路径错误,对于请求会返回 index.html 中的内容,可据此判断;

# 二、组件内使用

通常情况下,我们推荐在 index.html 中引用 js 文件,在组件中执行初始化方法,如下所示,如需在 js 代码中动态引入 sdk,请直接查看本节第 4 部分内容

<body id="wholeFrame">
  <div id="app"></div>
  <script
    type="text/javascript"
    src="/assets/ZwCloud2DSDK/ZwCloud2D.js"
  ></script>
</body>

根据前端主流框架的划分,以下主要包括四部分内容:1.基于 vue 框架的使用说明;2.基于 angular 框架的使用说明;3.基于 react 框架的使用说明;4.补充说明。

# 1.基于 vue 框架的使用说明

vue 框架需要在 mouted 生命周期执行初始化方法,请确保 ZwInit 方法传入的 dom 元素是正确的(id 名或类名不作限制),此元素将作为 sdk 的容器。

<template>
  <div id="container" style="width: 100vw; height: 100vh"></div>
</template>

<script>
export default {
  name: "view",
  data() {
    return {};
  },
  props: {},
  components: {},
  created() {},
  mounted() {
    this.initializeViewer().then(() => {
      // 设置加载图纸的docId
      window.ZwCloud2D.ZwDataProcessor.ZwSetLoadDwg(docId);

      // 加载文档
      window.ZwCloud2D.ZwDataProcessor.ZwLoad();
    });
  },
  methods: {
    // 初始化配置
    initializeViewer: async () => {
      try {
        // 设置云服务连接配置
        window.ZwCloud2D.ZwDataProcessor.ZwSetConnectUrl(
          process.env.VUE_APP_ZW_URL
        );

        // 设置认证令牌
        // 使用Cloud2D公网服务时,需要设置请求token
        // window.ZwCloud2D.ZwDataProcessor.ZwSetToken(process.env.HTML_APP_ZW_TOKEN);

        // 初始化编辑器
        await window.ZwCloud2D.ZwEditor.ZwInit(
          document.getElementById("container")
        );
      } catch (error) {
        console.error("初始化失败:", error);
        // 可以添加错误处理逻辑
      }
    },
  },
};
</script>

# 2.基于 angular 框架的使用说明

angular 框架需要在 ngOnInit 生命周期执行初始化方法,请确保 ZwInit 方法传入的 dom 元素是正确的(id 名或类名不作限制),此元素将作为 sdk 的容器。

import { Component, OnInit } from "@angular/core";

@Component({
  selector: "app-dwg-editor",
  templateUrl: "./dwg-editor.component.html",
  styleUrls: ["./dwg-editor.component.scss"],
})
export class DwgEditorComponent implements OnInit {
  constructor() {}
  ngOnInit(): void {
    this.initializeViewer().then(() => {
      // 设置加载图纸的docId
      window.ZwCloud2D.ZwDataProcessor.ZwSetLoadDwg(docId);

      // 加载文档
      window.ZwCloud2D.ZwDataProcessor.ZwLoad();
    });
  }

  // 初始化配置
  initializeViewer () {
    try {
      // 设置云服务连接配置
      window.ZwCloud2D.ZwDataProcessor.ZwSetConnectUrl(
        process.env.VUE_APP_ZW_URL
      );

      // 设置认证令牌
      // 使用Cloud2D公网服务时,需要设置请求token
      // window.ZwCloud2D.ZwDataProcessor.ZwSetToken(process.env.HTML_APP_ZW_TOKEN);

      // 初始化编辑器
      await window.ZwCloud2D.ZwEditor.ZwInit(
        document.getElementById("container")
      );
    } catch (error) {
      console.error("初始化失败:", error);
      // 可以添加错误处理逻辑
    }
  },
}

# 3.基于 react 框架的使用说明

react 框架需要在 componentDidMount 生命周期执行初始化方法,请确保 ZwInit 方法传入的 dom 元素是正确的(id 名或类名不作限制),此元素将作为 sdk 的容器。

import React, { useEffect, useRef } from "react";
import { useLocation } from "react-router-dom";

const View = () => {
  const containerRef = useRef(null);
  const location = useLocation();

  // 初始化配置
  const initializeViewer = async () => {
    try {
      // 设置云服务连接配置
      window.ZwCloud2D.ZwDataProcessor.ZwSetConnectUrl(
        process.env.REACT_APP_ZW_URL
      );

      // 设置认证令牌
      // 使用Cloud2D公网服务时,需要设置请求token
      // window.ZwCloud2D.ZwDataProcessor.ZwSetToken(process.env.HTML_APP_ZW_TOKEN);

      // 初始化编辑器
      await window.ZwCloud2D.ZwEditor.ZwInit(containerRef.current);
    } catch (error) {
      console.error("初始化失败:", error);
      // 可以添加错误处理逻辑
    }
  };

  useEffect(() => {
    initializeViewer().then(() => {
      // 配置要加载的文档
      window.ZwCloud2D.ZwDataProcessor.ZwSetLoadDwg(docId);

      // 加载文档
      window.ZwCloud2D.ZwDataProcessor.ZwLoad();
    });

    // 清理函数(根据需要添加)
    return () => {
      // 如果需要清理资源,在此添加
    };
  }, [location.search]); // 依赖路由查询参数

  return (
    <div
      ref={containerRef}
      style={{
        width: "100vw",
        height: "100vh",
        position: "fixed",
        top: 0,
        left: 0,
      }}
    />
  );
};

export default View;

# 4.补充说明

本节内容适用于需在 js 代码中动态引入 sdk 的场景,在各个前端框架对应的生命周期时执行相关代码即可,如 vue 的 mouted、angular 的 ngOnInit 和 react 的 componentDidMount,注意,请务必按照如下所示的引用顺序,否则可能会引发某些时序问题。以下为基于 react 框架的例子。

import React from "react";
import PropTypes from "prop-types";
import "./Display.css";
export default class Display extends React.Component {
  static propTypes = {
    value: PropTypes.string,
  };

  render() {
    return <div id="container"></div>;
  }

  componentDidMount() {
    var oHead = document.getElementsByTagName("head")[0];

    var oScript = document.createElement("script");
    oScript.type = "text/javascript";
    oScript.src = "/assets/ZwCloud2DSDK/ZwCloud2D.js";

    oHead.appendChild(oScript);

    // 初始化配置
    const initializeViewer = async () => {
      try {
        // 设置云服务连接配置
        window.ZwCloud2D.ZwDataProcessor.ZwSetConnectUrl(
          process.env.REACT_APP_ZW_URL
        );

        // 设置认证令牌
        // 使用Cloud2D公网服务时,需要设置请求token
        // window.ZwCloud2D.ZwDataProcessor.ZwSetToken(process.env.HTML_APP_ZW_TOKEN);

        // 初始化编辑器
        await window.ZwCloud2D.ZwEditor.ZwInit(containerRef.current);
      } catch (error) {
        console.error("初始化失败:", error);
        // 可以添加错误处理逻辑
      }
    };

    oScript.onload = () => {
      initializeViewer().then(() => {
        // 配置要加载的文档
        window.ZwCloud2D.ZwDataProcessor.ZwSetLoadDwg(docId);

        // 加载文档
        window.ZwCloud2D.ZwDataProcessor.ZwLoad();
      });
    };
  }
}