在不同的控制器中创建片段时出现重复的ID错误

问题描述 投票:1回答:1

所以...我正在构建一个基本上是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


片段定义:http://dontpad.com/stackoverflowquestionsapui5

sapui5
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.