想象一个具有根视图的组件,如下所示:
rootView: 'myapp.view.App'
应用视图如下所示:
<mvc:View
xmlns:mvc="sap.ui.core.mvc"
xmlns:core="sap.ui.core"
xmlns="sap.m"
controllerName="myapp.controller.App"
displayBlock="true">
<App id="myapp">
<mvc:XMLView id="page1" viewName="myapp.view.Page1" />
</App>
</mvc:View>
正如您所看到的,为此视图设置了一个控制器。视图myapp.view.Page1
是另一个XML视图,具有自己的控制器并包含sap.m.Page
控件。
此Page1
控制器无法访问任何控件,而在ID前面指定__xmlview0--
。我知道它在视图中,因为App
在视图中。 createId
将创建相对于当前控制器的内容,因此它将返回__xmlview0--page1
。
例如,我可以从myapp.controller.Page
获取应用,但我也必须使用视图名称进行访问。我的网页也是如此。导航到应用程序中的新页面如下所示:
var app = this.byId('__xmlview0--myapp');
app.to('__xmlview0--page1');
this.createId('myapp')
会给我__xmlview0--page1--myapp
。
我还尝试将组件本身移出this.getOwnerComponent()
并使用createId
和getId
方法,但这使得__component0
代替__xmlview0
,所以这也是一个禁忌。
不是一个超级清晰的故事。也许这会给你一些视觉效果:
-Component.js
- App.view.xml <App id="myapp"></App>
- Page1.view.xml <Page id="page1"></Page>
- App.controller.js
- Page1.controller.js
//byId uses createId.
//myapp has id __xmlview0--myapp
this.createId('myapp') = __xmlview0--page1--myapp
this.getView().createId('myapp') = __xmlview0--page1--myapp
this.getOwnerComponent().byId('myapp') = __component0--myapp
this.getOwnerComponent().getView() is not a function
如何通过我的控制器确定添加__xmlview0
?我使用哪种createId
方法?我的rootView是错误的,是否有更有效的方法?如何从组件中获取myapp
?
答案 0 :(得分:2)
由于您正在使用该组件,并且您在组件配置中提到了rootview,因此有一个用于检索根视图的API
var comp = this.getOwnerComponent().getMetadata() // this is the view i am referring to here.
comp.getRootView()
你可以写一个递归导航this.parent(),直到你的sViewName等于comp.getRootView()。
此条目获取您正在查找的根视图,然后sId获取您可以用来追加的ID。
我不确定你想要实现什么,但这是一个我认为可以用来获取rootview的ID的黑客。
或者,您也可以在定义类似
的组件时指定rootView IDrootView: {
viewName : "ui.sample.demo.view.App",
id : "Root",
type : "XML"
},