2016-12-29 77 views
0

我需要创建一个UI5 coustom控件,我需要载入ESRI地图。需要创建一个需要其他AMD模块的UI5自定义控件

sap.ui.define([ 
"sap/ui/core/Control" 
], function (Control) { 
"use strict"; 
return Control.extend("custom.map.ESRIMap", { 
    init : function(){ 
     this._map = new Map('mapDiv',esriMapOptions); 
    } 
}); 
}); 

这就是我想要写我的自定义控件。

在那里我有装载ESRI的JavaScript API为

jQuery.sap.includeScript({ 
        url : "https://js.arcgis.com/3.18/init.js", 
        id : 'esriApi' 
       }); 

问题我面临的是ESRI库加载,如果我下面加载,

​​

它不会加载,因为它不是UI5模块

我要做的要求如下

require(["esri/map"],function(Map){ 

我需要帮助来编写一个UI5自定义控件或模块,我必须在返回第一个代码之前将UI5模块和ESRI AMD模块加载在一起。

+0

你正在使用哪个IDE /编辑器?我有同样的问题,所以需要更多的细节。你使用除jQuery之外的任何其他JS库吗? –

+0

IDE日食,只有ui5 – chiranjeevigk

+0

如果我没有错,你正在开发这样的https://github.com/Vikash2402/Lumira-Custom-Extension-AboutLumira而不是你使用SAPUI5应用程序的可视化扩展。 –

回答

0

一般而言,大多数AMD模块加载程序不支持ArcGIS API for JavaScript使用的Dojo AMD插件语法(例如:dojo/i18n)。因此,加载这些模块的唯一可靠方法是使用上面提到的Dojo的require()

当使用其他模块装载机时,我们经常使用“嵌套的需求”模式。在你的情况下,它会是这个样子:

sap.ui.define([ 
    "sap/ui/core/Control" 
], function (Control) { 
    "use strict"; 
    return Control.extend("custom.map.ESRIMap", { 
     init : function() { 
     require(["esri/map"],function(Map){ 
      // now you have access to Control and Map 
      this._map = new Map('mapDiv',esriMapOptions); 
     }); 
     } 
    }); 
}); 

记住require()是异步并且在所有的可能性会导致网络请求获取模块脚本。我对UI5框架一无所知,以及是否可以在控件的init()中进行异步请求。如果不是,您可能需要找到另一个要求的地方。

该模式在更详细的描述in this blog post中有详细描述,它链接到其在React和Angular应用程序中使用的其他示例。您也许也可以使用esri-loader,它只是提供一个API来隐藏全局使用require()