如何相对于定义模块

时间:2018-02-23 22:00:19

标签: sapui5

我创建了一个库项目,因此我可以在应用程序之间共享格式化程序和一些自定义控件。这非常有效,它只是将库添加到 neo-app.json 文件中。现在我可以加载我的通用格式化程序:

应用程序/新app.json

{
    "path": "/resources/shared/",
    "target": {
        "type": "application",
        "name": "mysharedlibrary",
        "entryPath": "/"
    },
    "description": "My shared library"
}

应用程序/控制器

sap.ui.define([
    "shared/formatters"
], function(formatters) {
//etc

然后我想添加一个已经设置了格式化程序的共享基本控制器。所以我进入我的共享库项目并添加一个控制器,然后添加格式化程序:

mysharedlibrary / SharedController

sap.ui.define([
    "sap/ui/core/mvc/Controller",
    "formatters" /* <----- this is the problem */
], function(Controller, formatter) {
    "use strict";

    return Controller.extend("shared.SharedController", {
        formatter: formatter
    });
});

然后在我的应用中使用它:

应用程序/ Controller.js

// fails. Shared base controller can't load formatter. 
sap.ui.define([
    "shared/SharedController"
], function(Controller) {
    "use strict";

    return Controller.extend("my.app.controller.App", {

    });
});

这种方法不起作用。实现此控制器的应用程序可以找到控制器,但是然后将格式化程序加载到共享控制器似乎失败,因为找不到它。我不确定如何使共享控制器加载文件相对于它自己的路径而不是相对于实现应用程序的路径。

我在SharedController文件中放入什么来加载格式化程序?

1 个答案:

答案 0 :(得分:4)

sap.ui.define支持声明相对于模块自身路径的依赖关系。

  

为方便起见,依赖项的名称可以从段'./'开始,它将被包含当前定义的模块(相对名称)的包的名称替换。

     

最佳做法是尽可能为依赖项使用相对名称。

在上面的例子中,如果 SharedController.js formatters.js 存储在同一个文件夹中,控制器的依赖关系将如下所示:

sap.ui.define([
  "sap/ui/core/mvc/Controller",
  "./formatters"
], function(Controller, formatter) {
  "use strict";

  return Controller.extend("shared.SharedController", {
    formatter: formatter
  });
});

如果它在上层目录中,那么就像这样:"../formatters"等等。