如何在SAPUI5中注入自定义服务

时间:2018-04-28 05:03:37

标签: dependency-injection sapui5

SAPUI5中是否有类似角度服务的概念?我需要向另一个自定义类注入一个自定义服务(基本上是一个带有一些方法的类),我希望框架会自动实例化我的自定义服务,但是当我尝试使用它时,它是构造函数,而不是宾语。 由不必要的细节修剪的代码在这里:

自定义服务:

    sap.ui.define([
    "sap/ui/base/Object",
    "ArA/model/productionOrdersDefinition/Order"
], function(Object, Order) {
    "use strict";
    return Object.extend("ArA.model.productionOrdersDefinition.InputProvider", {
        constructor: function() {

        },
        onInit: function(){
            this.order = new Order();
            this.order.id  = "0000133535";
            // ...
        },
        getOrder: function(){
            // ...
            return this.order;
        }
    });
});

使用自定义服务的对象:

    sap.ui.define([
    "ArA/model/productionOrdersDefinition/BaseObject",
    "ArA/model/productionOrdersDefinition/Order",
    "ArA/model/productionOrdersDefinition/InputProvider"
], function(BaseObject, Order, InputProvider) {
    "use strict";
    return BaseObject.extend("ArA.model.productionOrdersDefinition.ManagerProgrammazione", {
        constructor: function() {
            BaseObject.call(this);
            // this  InputProvider is a constructor (method) and getOrder is not a function
            var order = InputProvider.getOrder();
            // ...
        }
    });
});

2 个答案:

答案 0 :(得分:2)

看起来您尝试将经验和概念从Angular转移到UI5。但是以UI5世界设计的方式做得更好:)

有一个模型的概念,旨在基本上处理数据。您可以像创建自己的模型一样创建自己的模型 - 基础UI5对象的扩展或JSONModel。很可能你不会使用OData协议进行网络通信,因此你将把数据存储在JSONModel中。

在模型中声明特定于域的方法,并在控制器中直接或在应用程序的组件中实例化它们(如果您希望为所有控制器提供一种全局模型)。您可以通过getOwnerComponent方法从任何控制器获取组件实例。

组织数据模型的另一种方法是创建一种特殊的对象,称为" BO" - 业务对象,此BO将处理所有特定于域的事务(实例化所需的模型,进行网络连接,数据操作等)。因此,您需要在控制器中创建此BO,并在触发用户操作后从控制器调用所需的高级方法。

此外,您还必须在控制器或组件生命周期方法中销毁模型/ BO。

答案 1 :(得分:1)

只需在代码中添加实例化,它就应该开始工作了:

var this._oInputProvider = new InputProvider();
var order = this._oInputProvider.getOrder();