เกิดข้อผิดพลาด ID ซ้ำเมื่อสร้างแฟรกเมนต์ในคอนโทรลเลอร์ที่แตกต่างกัน

ดังนั้น... ฉันกำลังสร้างแอปพลิเคชันที่เป็น 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 เมื่อฉันพยายามใช้กล่องโต้ตอบเดียวกันเป็นครั้งที่สอง โดยใช้โค้ดเดียวกันกับด้านบน มันแสดงข้อผิดพลาดต่อไปนี้:

การเพิ่มองค์ประกอบที่มีรหัสซ้ำ 'addCustomerNameField'

ID "addCustomerNameField" มาจากองค์ประกอบแรกของฉันภายในแฟรกเมนต์ของฉัน

แม้ว่าฉันจะมี 'ถ้าการตรวจสอบ' ในทั้งสองวิธีและเนื่องจากอยู่ในตัวควบคุมที่แตกต่างกัน แต่ 'ถ้า' สุดท้ายที่ได้รับการตรวจสอบนั้นมีวัตถุ (this.oAddCustomerDialog) ไม่ได้กำหนดไว้ (แต่ไม่ควรมีค่าที่ไม่ได้กำหนด) และกำลังสร้างอีกครั้ง sap.ui.xmlfragment.


คำจำกัดความของแฟรกเมนต์: http://dontpad.com/stackoverflowquestionsapui5


person Luis Henrique Valgoi    schedule 23.12.2016    source แหล่งที่มา


คำตอบ (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());
},

นอกจากนี้ โปรดตรวจสอบหัวข้อเอกสารต่อไปนี้: ID ใน Declarative XML หรือ 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< /a> แทน!

Fragment.load({
  id: this.getView().getId(),
  name: "com.sap.lccapp.fragment.AddCustomer",
  controller: this,
}); // returns a promise
person Rahul Bhardwaj    schedule 24.12.2016