如何不通过手机显示DetailNoObjectsAvailable视图?

时间:2018-08-15 08:42:31

标签: sapui5 master-detail

我已经从主从模板创建了一个sapui5项目。我要实现的是通过移动设备显示一个空列表(在主视图中),而无需导航到DetailNoObjectsAvailable视图。我只是找不到从何处调用DetailNoObjectsAvailable视图。

我要实现此目的的原因是,当列表开头没有对象,然后将一个对象添加到odata源时,除了“没有可用对象”之外,我什么也看不到,并且无法导航到主列表以手动刷新它。我必须在fiori客户端浏览器中刷新整个页面才能看到它。当列表开头不为空并且我将一个对象添加到odata源时,该列表会自动刷新,并且看到它不会遇到任何问题。

我没有更改路由定义中的任何内容:

"routes": [
	{
		"pattern": "",
		"name": "master",
		"target": [
			"object",
			"master"
		]
	}, {
		"pattern": "visitors_view/{objectId}",
		"name": "object",
		"target": [
			"master",
			"object"
		]
	}
],
"targets": {
	"master": {
		"viewName": "Master",
		"viewLevel": 1,
		"viewId": "master",
		"controlAggregation": "masterPages"
	},
	"object": {
		"viewName": "Detail",
		"viewId": "detail",
		"viewLevel": 2
	},
	"detailObjectNotFound": {
		"viewName": "DetailObjectNotFound",
		"viewId": "detailObjectNotFound"
	},
	"detailNoObjectsAvailable": {
		"viewName": "DetailNoObjectsAvailable",
		"viewId": "detailNoObjectsAvailable"
	},
	"notFound": {
		"viewName": "NotFound",
		"viewId": "notFound"
	}
}

2 个答案:

答案 0 :(得分:0)

路由到notFound对象的机制在manifest.json中找到:

manifest.json:绕过+目标路由配置

 "routing": {
            "config": {
                "routerClass": "sap.f.routing.Router",
                "viewType": "XML",
                "viewPath": "test.test.view",
                "controlId": "layout",
                "controlAggregation": "beginColumnPages",
                "bypassed": {
                    -------> "target": "notFound" <--------
                },
                "async": true
            },



"targets": {
                "notFound": {
                    "viewName": "NotFound",
                    "viewId": "notFound"
                }
            }

在webapp /视图中查看:

<mvc:View
    controllerName="test.test.controller.NotFound"
    xmlns:mvc="sap.ui.core.mvc"
    xmlns="sap.m">
    <MessagePage
        id="page"
        title="{i18n>notFoundTitle}"
        text="{i18n>notFoundText}"
        icon="sap-icon://document">
    </MessagePage>
</mvc:View>

这就是您想要的吗?

也许可以通过在manifest.json中绕过的部分中从“ target”:“ notFound”更改为“ target”:“ master”来解决您的问题。

更新:Detail.controller.js

_onBindingChange : function () {
            var oView = this.getView(),
                oElementBinding = oView.getElementBinding();

            // No data for the binding
            if (!oElementBinding.getBoundContext()) {
                this.getRouter().getTargets().display("detailObjectNotFound");  <------------
                // if object could not be found, the selection in the master list
                // does not make sense anymore.
                this.getOwnerComponent().oListSelector.clearMasterListSelection();
                return;
            }

答案 1 :(得分:-1)

通过注释ListSelector.js中的某些行解决了该问题。他们在控制台中引起了错误,而这又是导致我出现问题的原因:

constructor : function () {
	this._oWhenListHasBeenSet = new Promise(function (fnResolveListHasBeenSet) {
		this._fnResolveListHasBeenSet = fnResolveListHasBeenSet;
	}.bind(this));
	this.oWhenListLoadingIsDone = new Promise(function (fnResolve, fnReject) {
		this._oWhenListHasBeenSet
			.then(function (oList) {
				oList.getBinding("items").attachEventOnce("dataReceived",
					function (oData) {
						if (!oData.getParameter("data")) {
							fnReject({
								list : oList,
								error : true
							});
						}
						var oFirstListItem = this.getFirstListItem();
						if (oFirstListItem) {
							fnResolve({
								list : oList,
								firstListitem : oFirstListItem
							});
						} 
						// else {
						// 	fnReject({
						// 		list : oList,
						// 		error : false
						// 	});
						//}
					}.bind(this)
				);
			}.bind(this));
	}.bind(this));
},