所以......我正在构建一个基本上是CRUD的应用程序。在此应用程序中,我有以下视图/控制器: VisitEdit 和 RequestNew 。
在 RequestNew 控制器上,我有一个处理按下按钮的功能:
onRequestNewAddCustomerPress: function(oEvent) {
if( !this.oAddCustomerDialog ){
this.oAddCustomerDialog = sap.ui.xmlfragment("com.sap.lccapp.fragment.AddCustomer", this);
}
this.oAddCustomerDialog.openBy(oEvent.getSource());
},
我在同一个控制器上有onExit
功能。它现在是空的,因为我已经使用此对象的.destroy()
函数(oAddCustomerDialog
)进行了大量测试,并且它会继续弹出错误。
问题是;在 VisitEdit 控制器上,当我尝试第二次使用相同的对话框时,使用与上面相同的代码,它显示以下错误:
添加重复ID为'addCustomerNameField'的元素
ID "addCustomerNameField"
来自我片段中的第一个元素。
虽然我对两种方法都有'if verification',并且因为它位于不同的控制器中,但是正在验证的最后一个'if'的对象(this.oAddCustomerDialog
)是未定义的(但它不应该具有未定义的值)并且它再次创建sap.ui.xmlfragment
。
答案 0 :(得分:1)
您可以在实例化片段时关联唯一ID。这样,这个唯一ID将是前缀,其中包含片段包含的控件的ID。
因此,两个不同的代码将是:
onRequestNewAddCustomerPress: function(oEvent) {
if (!this.oAddCustomerDialog) {
this.oAddCustomerDialog = sap.ui.xmlfragment("idOnNewRequest","com.sap.lccapp.fragment.AddCustomer", this);
}
this.oAddCustomerDialog.openBy(oEvent.getSource());
},
然后:
onVisitEditAddCustomerPress: function(oEvent) {
if (!this.oAddCustomerDialog) {
this.oAddCustomerDialog = sap.ui.xmlfragment("idOnEdit","com.sap.lccapp.fragment.AddCustomer", this);
}
this.oAddCustomerDialog.openBy(oEvent.getSource());
},
另外,请查看以下文档主题: IDs in Declarative XML or HTML Fragments
编辑:如果从两个不同的视图调用这些片段,最好使用视图的ID。我会修改代码以实例化片段,如下所示:
this.oAddCustomerDialog = sap.ui.xmlfragment(this.getView().getId(), "com.sap.lccapp.fragment.AddCustomer", this);
从UI5 1.58开始,不推荐使用工厂函数sap.ui.*fragment
。请改用Fragment.load
!
Fragment.load({
id: this.getView().getId(),
name: "com.sap.lccapp.fragment.AddCustomer",
controller: this,
}); // returns a promise