Sapui5 一个应用程序有多个组件。js:如何加载共享模块?

Sapui5 一个应用程序有多个组件。js:如何加载共享模块?,sapui5,Sapui5,我们有一个SAPUI5应用程序,其中我们在相应的子文件夹中定义了多个组件(即多个Component.js文件),每个组件都是应用程序根目录的直接子级。下图显示了项目结构: 组件1指定为com.test.component1,组件2指定为com.test.component2。共享代码位于根目录/Shared中,定义为每个组件控制器中的依赖项 共享/Utils.js: sap.ui.define([], function () { "use strict"; return {.

我们有一个SAPUI5应用程序,其中我们在相应的子文件夹中定义了多个组件(即多个Component.js文件),每个组件都是应用程序根目录的直接子级。下图显示了项目结构:

组件1指定为
com.test.component1
,组件2指定为
com.test.component2
。共享代码位于
根目录/Shared
中,定义为每个组件控制器中的依赖项

共享/Utils.js:

sap.ui.define([], function () {
    "use strict";

    return {...};
};
组件1/controller/Controller1.js:

sap.ui.define([
    "sap/ui/core/mvc/Controller",
    "test/shared/Utils"
], function (BaseController, Utils) {
    "use strict";
    // controller code

});
在本地(或在WebIDE中)运行index.html文件这一切都可以,但是当我们尝试将不同的组件集成到Fiori启动板时,却找不到共享资源(它尝试从/resources/shared加载它们)。我们认为这与为引导定义的sap ui resourceroots={“com.test”:“}数据有关,该数据在Component.js或manifest.json文件中缺失


为各个组件注册资源路径的正确方法是什么?

为您的实用程序使用组件/库

我在这里遇到的最明显的问题是:如果您使用组件概念,为什么您的共享代码也不是组件。组件不一定要有UI,这就是为什么要继承
UIComponent
和简单的
Component
。您只需将其作为component1/component2的依赖项加载,如下所示:

... 
return Component.extend("com.test.Component1", {
  metadata: {
    name: "Component1",
    dependencies: {
      libs: [ "sap.m" ],
      components: [ "test.shared" ]
  },
...
jQuery.sap.registerModulePath("test.shared", jQuery.sap.getModulePath("com.test.Component1") +"/../shared);
如果您觉得使用组件不合适,也可以将实用程序打包为库。你可能想看看,这有助于你建立一个

在不使用组件/库概念的情况下加载外部文件

无论如何,在引导上定义resourceroot类似于调用

jQuery.sap.registerModulePath("test.shared", "/path/to/your/source");
您可以在两个组件init中注册共享模块的模块路径。您可能必须在那里使用绝对路径,因为根据执行上下文(launchpad与standalone),相对路径可能会有所不同

您可以将路径设置为“相对”,如下所示:

... 
return Component.extend("com.test.Component1", {
  metadata: {
    name: "Component1",
    dependencies: {
      libs: [ "sap.m" ],
      components: [ "test.shared" ]
  },
...
jQuery.sap.registerModulePath("test.shared", jQuery.sap.getModulePath("com.test.Component1") +"/../shared);
Furhtermore如果您希望共享资源也能从缓存破坏中受益,您可能希望在以后使用此功能:

sap.ui.core.AppCacheBuster.register(jQuery.sap.getModulePath("test.shared"));

解决此问题的一种方法是在应用程序描述符(manifest.json)中定义
resourceRoots
属性:

尽管以下文件中写了什么,但这仍然有效:

由资源名称前缀键入的URL位置地图;仅允许组件内部的相对路径,并且不允许使用“.”字符


从一堆util模块/类中创建组件感觉不太好,但最终可能是一个解决方案。我们已经使用了
registerModulePath()
,但正如您所提到的,路径将是一个问题:如果我们需要指定一个绝对路径,我们如何保证可移植性?它不必是UIComponent,实用程序组件只会从组件继承。当然,把它变成一个图书馆会更好。您可以查看以构建一个。路径仍然是一个问题。。。我将尝试在那里查找更多信息,您可以尝试使用以下方法获得相对路径:jQuery.sap.registerModulePath(“test.shared”,jQuery.sap.getModulePath(“com.test.Component1”)+“/../shared);您能给我指出组件或库示例吗?不确定在grunt上下文中在何处查找它。我将尝试将registerModulePath与getModulePath结合使用。使用getModulePath()引用父目录无效。类似的问题可在此处找到: