【问题标题】:ArcGIS Javascript in AngularJS App - Error Loading ModulesAngularJS 应用程序中的 ArcGIS Javascript - 加载模块时出错
【发布时间】:2015-11-09 14:09:05
【问题描述】:

我有一个 AngularJS 应用程序,它使用 ArcGIS API 的 JavaScript 来显示地图。

我一直在使用单独的 require 语句,例如:

var esriMap = require("esri/map");

这对除Dojo layout Dijits 之外的所有模块都有效。当我尝试添加这样的 require 语句时:

var Scalebar = require("esri/dijit/Scalebar");

我收到以下错误:

Error: undefinedModule(…) "Error: undefinedModule at Error (native) at d (http://js.arcgis.com/3.12/init.js:15:382) at La (http://js.arcgis.com/3.12/init.js:24:296) at r (http://js.arcgis.com/3.12/init.js:15:476)

如果可能,我想继续使用单独的 require 语句。有什么理由让我只在 dijit 模块上收到此错误?

【问题讨论】:

    标签: angularjs dojo require arcgis-js-api


    【解决方案1】:

    单参数require 仅适用于已加载的模块。从undefinedModule 错误来看,您正在尝试在从未加载的模块上使用单参数require。要引用尚未加载的模块,您需要使用标准的 AMD 要求语法:

    require([
        'dijit/layout/StackContainer',
        ...
    ], function (StackContainer, ...) {
        ...
    });
    

    始终使用这种格式通常是最简单的。 (也可以认为它更可靠,因为否则您可能依赖于假设您正在使用的模块已经加载,无论是直接还是间接作为依赖项。)

    【讨论】:

    • 谢谢肯。我仍然不完全清楚为什么单参数要求失败,但标准 AMD 正在工作。
    • 一些 dojo 模块已经是 Esri 预构建的 init 层中包含的依赖项,因此这些模块已经注册到加载器的缓存中,可以通过 require(mid) 毫无问题地使用。其他尚未注册到缓存中的需要通过require(deps, factory) 加载。通常,仅当您确定某些内容已经加载并且还没有直接引用时,才建议使用前者。
    • 顺便说一句 - @KenFranqueiro 你给了我an idea of how to improve angular-esri-map
    【解决方案2】:

    另外,我不知道你是否看过这个,但 Esri 确实有一些 Angular 模块可以帮助将地图集成到 Angular 应用程序中:

    https://github.com/Esri/angular-esri-map

    这包括一个名为 esriLoader 的服务,它封装了 Dojo 的 require 并允许您传递将接收模块的回调或获得一个与模块一起解析为数组的 Promise。

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 2019-12-27
      • 2016-08-23
      • 2020-07-04
      • 1970-01-01
      • 2020-10-07
      相关资源
      最近更新 更多