สร้างการควบคุมแบบกำหนดเอง: ข้อผิดพลาดในการขยาย ProcessFlow

Jan 07 2021

ฉันกำลังพยายามสร้างการควบคุมแบบกำหนดเองจากตัวควบคุมโฟลว์กระบวนการ นี่คือลักษณะของการควบคุมฐาน:

ตอนนี้ฉันต้องการให้ ProcessFlow มีโหนดที่กำหนดเองซึ่งจะมีปุ่มในแต่ละโหนดดังนี้:

ดังนั้นปัญหาที่ฉันพบคือเนื่องจากเรามี ProcessFlowNodes ที่กำหนดเอง (ภาพเป็นบันทึกย่อที่มีลักษณะเป็นสี่เหลี่ยมจัตุรัส) เราจึงต้องมีการควบคุม ProcessFlow ที่กำหนดเองเนื่องจาก ProcessFlow มาตรฐานอนุญาตเฉพาะsap.suite.commons.ProcessFlowNodeการควบคุมประเภทภายใต้การnodesรวมเท่านั้น

ดังนั้นอุปสรรค์คือการสร้างคอนโทรล ProcessFlow แบบกำหนดเองด้วยการรวมแบบกำหนดเองที่ยอมรับคอนโทรล ProcessFlowNode แบบกำหนดเอง คำถามของฉันในเรื่องนี้คือ:

  • ฉันจะขยายsap.ui.core.Controlหรือsap.suite.commons.ProcessFlow? ถ้าเป็น Control จะรู้ได้อย่างไรว่าเป็น ProcessFlow? สมมติฐานของฉันที่นี่ (ฉันเชื่อว่าฉันกำลังตอบคำถามของตัวเองบางส่วน) คือ ProcessFlow จะถูกขยายออกไป จากนั้นปัญหาถัดไปคือข้อผิดพลาดของคอนโซลเช่น "oControl must be an sap.ui.core.Control หรือ empty" เมื่อฉันพยายามแสดงผลการควบคุมด้วยoRm.renderControl(oControl.getAggregation("lanes")). ฉันจะแก้ไขข้อผิดพลาดเหล่านี้ได้อย่างไร


นี่คือโค้ดตัวอย่างพร้อมภาพหน้าจอของลักษณะการทำงานของ ProcessFlow (namespace xmlns="sap.suite.ui.commons") ขั้นพื้นฐาน

<ProcessFlow>
  <nodes>
    <ProcessFlowNode
      title="Sales Order Volume"
      titleAbbreviation="SOV1"
      laneId="0"
      nodeId="01"
      children="010,011"
      state="Positive"
      stateText="OK status"
      texts="Sales Order Document Overdue long text for the wrap up all the aspects - Not cleared"
      highlighted="false"
      focused="true"
    />
    <ProcessFlowNode
      title="Outbound Delivery 40"
      titleAbbreviation="OD40"
      laneId="0"
      nodeId="010"
      state="Negative"
      stateText="NOT OK"
      texts="Save Our Soul"
      highlighted="false"
      focused="false"
    />
    <!-- ... -->
  </nodes>
  <lanes>
    <ProcessFlowLaneHeader laneId="0" iconSrc="sap-icon://order-status" text="Order Processing" position="0" />
    <ProcessFlowLaneHeader laneId="1" iconSrc="sap-icon://monitor-payments" text="Delivery Processing" position="1" />
    <ProcessFlowLaneHeader laneId="2" iconSrc="sap-icon://payment-approval" text="Invoicing" position="2" />
    <ProcessFlowLaneHeader laneId="3" iconSrc="sap-icon://money-bills" text="Accounting" position="3" />
  </lanes>
</ProcessFlow>


นี่คือรหัสของฉันจนถึงตอนนี้:

ควบคุม:

sap.ui.define([
  "sap/suite/ui/commons/ProcessFlow"
], function(ProcessFlow){
  "use strict";

  return ProcessFlow.extend("ns.testino.control.SuperProcessFlow", {
    metadata: {
      aggregations:{
        "lanes":{
          type: "sap.suite.ui.commons.ProcessFlowLaneHeader",
          multiple: true,
          singularName: "lane"
        },
        "nodes": {
          type: "sap.suite.ui.commons.ProcessFlowNode",
          multiple: true,
          singularName: "node"
        }
      }
    },

    init: function() {
      
    },

    renderer: function(oRM,oControl) {
      oRM.renderControl(oControl.getAggregation("lanes"));
    }
  });
});

ดูในแอป:

<mvc:View controllerName="ns.testino.controller.coke2"
  xmlns:mvc="sap.ui.core.mvc"
  xmlns:m="sap.m"
  xmlns="sap.suite.ui.commons"
  xmlns:custom="ns.testino.control"
>
  <m:Panel>
    <custom:SuperProcessFlow>
      <custom:lanes>
        <ProcessFlowLaneHeader laneId="0" iconSrc="sap-icon://order-status" text="Order Processing" position="0" />
        <ProcessFlowLaneHeader laneId="1" iconSrc="sap-icon://monitor-payments" text="Delivery Processing" position="1" />
        <ProcessFlowLaneHeader laneId="2" iconSrc="sap-icon://payment-approval" text="Invoicing" position="2" />
        <ProcessFlowLaneHeader laneId="3" iconSrc="sap-icon://money-bills" text="Accounting" position="3" />
      </custom:lanes>
    </custom:SuperProcessFlow>
  </m:Panel>
</mvc:View>

คำตอบ

1 EldwinCheung Jan 08 2021 at 10:31

ฉันได้แก้ไขข้อผิดพลาดโดยการลบinitเมธอดและมีrendererฟังก์ชันว่างเปล่า

sap.ui.define([
  "sap/suite/ui/commons/ProcessFlow"
], function(ProcessFlow) {
  "use strict";

  return ProcessFlow.extend("ns.testino.control.CustomProcessFlow", {
    metadata: {
      // ...
    },

    // No init: function() {},

    renderer: {} // leave empty if you want it to render like the standard control

  });
});