为什么有时控制器不加载?

时间:2018-11-05 16:24:49

标签: sapui5

我有一个问题,有时控制器未加载:

enter image description here

,您将看到错误消息。它应加载以下控制器(标有红色边框):

enter image description here

为什么有时不加载?

加载控制器后,它看起来像:

enter image description here

更新:

我正在使用flexible column layout

App.view.xml看起来像:

<mvc:View controllerName="ch.mindustrie.ZMM_CLASSIFICATION.controller.App" xmlns:html="http://www.w3.org/1999/xhtml"
    xmlns:mvc="sap.ui.core.mvc" displayBlock="true" xmlns="sap.m" xmlns:f="sap.f">
    <App id="root">
        <f:FlexibleColumnLayout id="idClassLayout"/>
    </App>
</mvc:View>

manifest.json文件:

{
    "_version": "1.9.0",
    "sap.app": {
        "id": "ch.mindustrie.ZMM_CLASSIFICATION",
        "type": "application",
        "i18n": "i18n/i18n.properties",
        "applicationVersion": {
            "version": "0.1.0"
        },
        "title": "{{appTitle}}",
        "description": "{{appDescription}}",
        "sourceTemplate": {
            "id": "servicecatalog.connectivityComponentForManifest",
            "version": "0.0.0"
        },
        "dataSources": {
            "ZMM_CLASSIFICATION_SRV": {
                "uri": "/sap/opu/odata/sap/ZMM_CLASSIFICATION_SRV/",
                "type": "OData",
                "settings": {
                    "odataVersion": "2.0",
                    "localUri": "localService/ZMM_CLASSIFICATION_SRV/metadata.xml"
                }
            }
        }
    },
    "sap.ui": {
        "technology": "UI5",
        "icons": {
            "icon": "",
            "favIcon": "",
            "phone": "",
            "phone@2": "",
            "tablet": "",
            "tablet@2": ""
        },
        "deviceTypes": {
            "desktop": true,
            "tablet": true,
            "phone": true
        },
        "supportedThemes": [
            "sap_hcb",
            "sap_belize"
        ]
    },
    "sap.ui5": {
        "handleValidation": true,
        "rootView": {
            "viewName": "ch.mindustrie.ZMM_CLASSIFICATION.view.App",
            "type": "XML",
            "async": true,
            "id": "app"
        },
        "dependencies": {
            "minUI5Version": "1.50.0",
            "libs": {
                "sap.ui.layout": {},
                "sap.ui.core": {},
                "sap.m": {},
                "sap.f": {},
                "sap.collaboration": {
                    "lazy": true
                }
            }
        },
        "contentDensities": {
            "compact": true,
            "cozy": true
        },
        "models": {
            "i18n": {
                "type": "sap.ui.model.resource.ResourceModel",
                "settings": {
                    "bundleName": "ch.mindustrie.ZMM_CLASSIFICATION.i18n.i18n"
                }
            },
            "Classification": {
                "uri": "/sap/opu/odata/sap/ZMM_CLASSIFICATION_SRV/",
                "type": "sap.ui.model.odata.v2.ODataModel",
                "settings": {
                    "defaultOperationMode": "Server",
                    "defaultBindingMode": "OneWay",
                    "defaultCountMode": "Request"
                },
                "dataSource": "ZMM_CLASSIFICATION_SRV",
                "preload": true
            }
        },
        "resources": {
            "css": [
                {
                    "uri": "css/style.css"
                }
            ]
        },
        "routing": {
            "config": {
                "routerClass": "sap.f.routing.Router",
                "viewType": "XML",
                "viewPath": "ch.mindustrie.ZMM_CLASSIFICATION.view",
                "controlId": "idClassLayout",
                "bypassed": {
                    "target": [
                        "search",
                        "characteristic"
                    ]
                },
                "async": true
            },
            "routes": [
                {
                    "pattern": "",
                    "name": "search",
                    "target": [
                        "characteristic",
                        "search"

                    ],
                    "layout": "TwoColumnsBeginExpanded"
                },
                {
                    "pattern": "search/{internalclassnum}",
                    "name": "characteristic",
                    "target": [
                        "search",
                        "characteristic"
                    ],
                    "layout": "TwoColumnsMidExpanded"
                }
            ],
            "targets": {
                "search": {
                    "viewName": "Search",
                    "viewLevel": 1,
                    "viewId": "search",
                    "controlAggregation": "beginColumnPages"
                },
                "characteristic": {
                    "viewName": "Characteristic",
                    "viewLevel": 2,
                    "viewId": "characteristic",
                    "controlAggregation": "endColumnPages"
                }
            }
        }
    },
    "sap.platform.abap": {
        "uri": "/sap/bc/ui5_ui5/sap/zmm_classifi/webapp",
        "_version": "1.1.0"
    }
}

Search.view.xml

<mvc:View xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" xmlns:l="sap.ui.layout" xmlns:uxap="sap.uxap"
    xmlns:f="sap.ui.layout.form" xmlns:smartFilterBar="sap.ui.comp.smartfilterbar"
    controllerName="ch.mindustrie.ZMM_CLASSIFICATION.controller.Search" xmlns:html="http://www.w3.org/1999/xhtml">
    <smartFilterBar:SmartFilterBar id="SelectionFilterBar" entitySet="ZMM_C_CLASSIFICATION" search="onSearchClass">
        <smartFilterBar:controlConfiguration>
            <smartFilterBar:ControlConfiguration key="ClassType" visibleInAdvancedArea="true" preventInitialDataFetchInValueHelpDialog="false"></smartFilterBar:ControlConfiguration>
            <smartFilterBar:ControlConfiguration key="ClassNum" visibleInAdvancedArea="true" preventInitialDataFetchInValueHelpDialog="false"></smartFilterBar:ControlConfiguration>
        </smartFilterBar:controlConfiguration>
    </smartFilterBar:SmartFilterBar>
    <Tree id="ClassTree" items="{path: 'Tree>/'}" toggleOpenState="onOpenAnItemOnTree">
        <CustomTreeItem>
            <FlexBox width="100%" alignItems="Center" justifyContent="SpaceBetween">
                <items>
                    <Label text="{Tree>text}" wrapping="true"/>
                    <Button icon="sap-icon://display" type="Transparent" press="onClassPressed"/>
                </items>
            </FlexBox>
        </CustomTreeItem>
    </Tree>
</mvc:View>

还有Search.Controller

sap.ui.define([
    "ch/mindustrie/ZMM_CLASSIFICATION/controller/BaseController"
], function (BaseController) {
    "use strict";

    return BaseController.extend("ch.mindustrie.ZMM_CLASSIFICATION.controller.Search", {

        /**
         * Called when a controller is instantiated and its View controls (if available) are already created.
         * @memberOf ch.mindustrie.ZMM_CLASSIFICATION.view.Search
         */
        onInit: function () {
            //Set model for smart filter bar
            const oModel = this.getModel("Classification");
            this.setModel(oModel);

            //Model for classification tree
            this.setModel(new sap.ui.model.json.JSONModel(), "Tree");
        },

        onSearchClass: function () {
            const aFilter = this.byId("SelectionFilterBar").getFilters();

            const self = this;
            //Build the first node
            this._readClassification(aFilter)
                .then(aData => self.getModel("Tree").setProperty("/", aData));
        },

        /*
         * Read classification from server.
         */
        _readClassification: function (aFilter) {

            const self = this;
            //Build entry node
            const oModel = this.getModel("Classification");

            const oDateFrom = new sap.ui.model.Filter({
                path: "ValidFrom",
                operator: sap.ui.model.FilterOperator.LE,
                value1: new Date()
            });

            const oDateUntil = new sap.ui.model.Filter({
                path: "ValidFrom",
                operator: sap.ui.model.FilterOperator.GE,
                value1: new Date()
            });

            return new Promise((resolve, reject) => {
                oModel
                    .read("/ZMM_C_CLASSIFICATION", {
                        filters: aFilter.concat([oDateFrom, oDateUntil]),
                        success: function (oData) {
                            let aTreeWithNodes = [];
                            const aTree = oData.results.map(self._buildEntryTree);

                            aTree.forEach((oNode, index) => {

                                self._readSubClasses(oNode.internalClass)
                                    .then(aData => {
                                        const oWithNodes = aTree[index];
                                        if (aData.length > 0) {
                                            oWithNodes.nodes = aData;
                                        }
                                        aTreeWithNodes.push(oWithNodes);
                                        if (aTreeWithNodes.length === aTree.length) {
                                            resolve(aTreeWithNodes);
                                        }
                                    });
                            });
                        },
                        error: function (oError) {
                            reject(oError);
                        }
                    });
            });
        },

        _readSubClasses: function (sSubInternalClass) {
            const oModel = this.getModel("Classification");
            const self = this;

            const oUpInteralClass = new sap.ui.model.Filter({
                path: "UpInternalClass",
                operator: sap.ui.model.FilterOperator.EQ,
                value1: sSubInternalClass
            });

            return new Promise((resolve) => {
                oModel
                    .read("/ZMM_C_CLASSSUB_REL", {
                        filters: [oUpInteralClass],
                        success: function (oData) {
                            const aNewNodes = (oData.results.length > 0 ? oData.results.map(self._prepareDescEntryNodes) : []);
                            resolve(aNewNodes);
                        },
                        error: function () {
                            resolve([]);
                        }
                    });
            });

        },

        /*
         * Build the entry node.
         */
        _buildEntryTree: function (oData) {
            return {
                text: oData.ClassType + " " + oData.ClassNum + " " + oData.ClassNumDescr,
                classType: oData.ClassType,
                classNum: oData.ClassNum,
                internalClass: oData.InternalClass,
                nodes: []
            };
        },

        onOpenAnItemOnTree: function (oEvent) {

            const bExpanded = oEvent.getParameter("expanded");
            if (!bExpanded) {
                return;
            }

            const iItemIndex = oEvent.getParameter("itemIndex");
            const oItemContext = oEvent.getParameter("itemContext");

            const oTree = this.byId("ClassTree");
            const oModel = this.getView().getModel("Tree");
            const sPath = oItemContext.getPath();
            const oCurrentNode = oModel.getProperty(sPath);
            this._loadOnDemand(oModel, oCurrentNode, sPath, oTree.getItems()[iItemIndex].getLevel());
        },

        /*
         * Load descendants asynchronously.
         */
        _loadOnDemand: function (oModel, oCurrentNode, sPath) {

            const aChildNodes = oCurrentNode.nodes.map(oClass => {
                return new sap.ui.model.Filter({
                    path: "InternalClass",
                    operator: sap.ui.model.FilterOperator.EQ,
                    value1: oClass.internalClass
                });

            });

            this._readClassification(aChildNodes)
                .then(aNewNodes => oModel.setProperty(sPath + "/nodes", aNewNodes));
        },

        /*
         * When the item in the tree is getting pressed.
         */
        onClassPressed: function (oEvent) {
            const oRow = oEvent.getSource().getBindingContext("Tree").getObject();
            this.getRouter().navTo("characteristic", {
                internalclassnum: oRow.internalClass
            });
        }

    });

});

1 个答案:

答案 0 :(得分:0)

我相信灵活性服务只能在Fiori启动板中使用,而不能在webide沙箱启动板中使用。如果部署,是否会遇到相同的问题?