我想基于现有视图动态创建视图,然后添加必要的路由/目标。目前我使用以下代码来实现此目的:
var viewName = name + "View";
var targetName = name + "Target";
var routeName = name + "Route";
if (this.getRouter().getRoute(routeName) === undefined) {
console.log("create view");
var view = sap.ui.view(({ viewName: "demo.view.Test", type: sap.ui.core.mvc.ViewType.XML }));
this.getRouter().getTargets().getViews().setView(viewName, view);
console.log("create target");
this.getRouter().getTargets().addTarget(targetName, {
viewName: viewName,
viewPath: "demo.view",
viewLevel: 2,
parent: "base",
controlId: "mainContainer",
controlAggregation: "pages",
title: name
});
console.log("create route");
this.getRouter().addRoute({
name: routeName,
pattern: name,
target: targetName
});
};
但是,如果我运行此代码(例如name =“Test2”)然后尝试导航到生成的路由,则会收到错误消息,指出无法找到包含该视图的文件(例如Test2.view.xml)。
有没有办法在没有视图文件的情况下将此动态创建的视图用作目标?
更新
为视图创建别名以支持多个实例的想法来自UI5文档:https://openui5.hana.ondemand.com/#/api/sap.m.routing.Targets/constructor(请参阅构造函数中的viewName)
从UI5 1.56开始,有一种新方法sap.ui.core.mvc.View.create。
你可以尝试这样的事情:
sap.ui.require(['sap/ui/core/mvc/View'],
function(View){
View.create({
viewName: "demo.view.ViewToGetCloned",
viewId: "demo.view.NameOfNewView",
type: sap.ui.core.mvc.ViewType.XML
}).then(function(oView) {
...
}.bind(this));
}.bind(this));