如何以 mock server 的方式本地啓動 SAP UI5 應用,使它不鏈接服務器端 OData 服務

咱們在作 SAP UI5 開發時,在視圖邏輯沒有開發完畢時,每每不但願鏈接服務器端的 OData 服務進行聯調,而僅僅鏈接本地端的測試數據。javascript

本文介紹若是啓動本地 mock server,將 SAP UI5 項目工程裏提早準備好的測試數據,渲染到 SAP UI5 應用的視圖上。java

本文介紹具體方法。json

  1. 由於不須要直接鏈接後臺 OData 服務,所以 manifest.json 的 dataSources 區域也就無需維護真實的服務器端 OData 服務的 url 了:

sap.ui5 區域裏,定義該應用的根視圖 (rootView)爲 SmartTable:服務器

  1. SmartTable.view.xml 的源代碼:
<mvc:View 
    xmlns="sap.m"
    xmlns:mvc="sap.ui.core.mvc"
    controllerName="sap.ui.demo.smartControls.SmartTable"
    xmlns:smartTable="sap.ui.comp.smarttable">
    <smartTable:SmartTable 
        id="smartTable_ResponsiveTable"
        tableType="ResponsiveTable" 
        editable="false"
        entitySet="Products" 
        header="Products" 
        showRowCount="true"
        useExportToExcel="false" 
        enableAutoBinding="true">
    </smartTable:SmartTable>
</mvc:View>

controller 什麼都不用實現:mvc

component.js 也不用實現:函數

  1. 主要的邏輯位於 sap.ui.core 的 Init hook 實現函數裏。加載項目工程文件夾 test/service 下面的 server.js, 啓動這個 mock server,而後將 sap.ui.demo.smartControls 這個 Component,放置到ComponentContainer,即 Component 容器裏渲染成最後的 HTML 源代碼:

主要代碼:測試

sap.ui.getCore().attachInit(function() {
        sap.ui.require([
            "sap/ui/demo/smartControls/test/service/server"
        ], function(server) {
            server.init();
            new sap.ui.core.ComponentContainer({
                name: "sap.ui.demo.smartControls",
                height: "100%"
            }).placeAt("content");
        });
    });

Mock server 的核心邏輯在這個 server.js 裏:ui

使用的是 SAP UI5 提供的標準 Mock server,位於目錄 sap/ui/core/util/MockServer 下面。url

sap.ui.define([
    "sap/ui/core/util/MockServer"
], function (MockServer) {
    "use strict";

    return {
        init: function () {
            var oMockServer = new MockServer({
                rootUri: "/here/goes/your/serviceUrl/"
            });

            MockServer.config({
                autoRespond: true, 
                autoRespondAfter: 1000
            });

            var sPath = jQuery.sap.getModulePath("sap.ui.demo.smartControls.test.service");
            oMockServer.simulate(sPath + "/metadata.xml", sPath);
            
            oMockServer.attachAfter(sap.ui.core.util.MockServer.HTTPMETHOD.GET, function(oEvent) {
                var oXhr = oEvent.getParameter("oXhr");
                var aResultFiltered = [];
                var fGetUriParameter = function(sUri, sKey) {
                    var sValue = "";
                    var aParams = decodeURIComponent(sUri).replace("?", "&").split("&");
                    aParams.some(function(sPairs) {
                        if (sKey === sPairs.split("=")[0]) {
                            sValue = sPairs.split("=")[1];
                            return true;
                        }
                    });
                    return sValue;
                };
                var sSearchText = fGetUriParameter(oXhr.url, "search");
                if (sSearchText) {
                    var aResults = oEvent.getParameter("oFilteredData").results;
                    aResults.forEach(function(oEntry) {
                        if (JSON.stringify(oEntry).indexOf(sSearchText) > -1) {
                            aResultFiltered.push(oEntry);
                        }
                    });
                    oEvent.getParameter("oFilteredData").results = aResultFiltered;
                }
            });
            oMockServer.start();
        }
    };
});

爲了配合 mock server 工做,本地必須保存一個 metadata.xml:spa

同時將本地測試數據,以 json 文件的形式維護在工程裏:

文件名必須爲 metadata.xml 裏定義的同名 entitySet:

最後本地讀取 mock server 返回的測試數據,應用界面以下:

更多Jerry的原創文章,盡在:"汪子熙":

相關文章
相關標籤/搜索