Sapui5 关闭后如何清除对话框/xmlfragment内容?

Sapui5 关闭后如何清除对话框/xmlfragment内容?,sapui5,Sapui5,我的对话框定义为: 假设这个对话框有很多输入/选择/组合框等等,用户在其中输入,关闭,导航到另一个主项和详细信息页面,再次打开这个对话框实例,信息仍然在这里。如果我想在用户每次关闭时清除信息/输入,该怎么办 关闭后销毁此对话框是解决此问题的唯一方法吗 对话框XML <Dialog afterClose="dialogAfterclose" > <beginButton> <Button text="yes" press="confirmOk"

我的对话框定义为:

假设这个对话框有很多输入/选择/组合框等等,用户在其中输入,关闭,导航到另一个主项和详细信息页面,再次打开这个对话框实例,信息仍然在这里。如果我想在用户每次关闭时清除信息/输入,该怎么办

关闭后销毁此对话框是解决此问题的唯一方法吗

对话框XML

<Dialog afterClose="dialogAfterclose" >
    <beginButton>
        <Button text="yes" press="confirmOk"/>
    </beginButton>
    <endButton>
        <Button text="no" press="confirmCancel"/>
    </endButton>
</Dialog>
您需要使用
sap.ui.core.Element的
destroy()

dialogAfterclose: function(oEvent) {
    this._oDialog.destroy();
}
按照你的代码

onOpenDialog : function () {
  var oView = this.getView();
  if (!this._oDialog) {
      this._oDialog = sap.ui.xmlfragment(oView.getId(), "sap.ui.demo.wt.view.HelloDialog");
      oView.addDependent(this._oDialog);
  }
  this._oDialog.open();
},     
dialogAfterclose: function(oEvent) {//function called after Dialog is closed
   this._oDialog.destroy();//destroy only the content inside the Dialog
},
confirmOk: function(oEvent) {
    this._oDialog.close();//Just close the Dialog, Dialog afterClose() will be called and destroy the Dialog content.
}
参考:

对话框XML

<Dialog afterClose="dialogAfterclose" >
    <beginButton>
        <Button text="yes" press="confirmOk"/>
    </beginButton>
    <endButton>
        <Button text="no" press="confirmCancel"/>
    </endButton>
</Dialog>
您需要使用
sap.ui.core.Element的
destroy()

dialogAfterclose: function(oEvent) {
    this._oDialog.destroy();
}
按照你的代码

onOpenDialog : function () {
  var oView = this.getView();
  if (!this._oDialog) {
      this._oDialog = sap.ui.xmlfragment(oView.getId(), "sap.ui.demo.wt.view.HelloDialog");
      oView.addDependent(this._oDialog);
  }
  this._oDialog.open();
},     
dialogAfterclose: function(oEvent) {//function called after Dialog is closed
   this._oDialog.destroy();//destroy only the content inside the Dialog
},
confirmOk: function(oEvent) {
    this._oDialog.close();//Just close the Dialog, Dialog afterClose() will be called and destroy the Dialog content.
}

参考:

我发现我的错误是由两个原因造成的:

一,。 在destory()之后忘记设置未定义

二,。 此对话框用于在不同视图中重用的表中,tableview id应设置为不同

//view 1
<mvc:XMLView id="modifyTableView" viewName="xxx.view.AssignTable"/>
//view 2
<mvc:XMLView id="detailTableView" viewName="xxx.view.AssignTable"/>
//视图1
//视图2

因此,
oView.getId()
不会在不同的控制器中生成相同的id。

我发现我的错误是由两个原因造成的:

/***********************************/
onOpenAddEmployeeDialog: function () {
    var oView = self.getView()
    var oDialog = oView.byId('addEmployeeFragment');

    if ((oDialog = !null)) {
       var oDialog = sap.ui.xmlfragment(oView.getId(), 'sap.ui.view.AddEmployeeFragment'
       oView.addDependent(oDialog);
    }

    var dialogModel = new JSONModel();
    oDialog.setModel(dialogModel, 'dialog');
    oDialog.open();

},
/***********************************/           


/***********************************/
 dialogAfterClose: function () {
    var oView = self.getView()
    var oDialog = oView.byId('addEmployeeFragment');

    //clear dialog Data
    var oDialogData = oDialog.getModel('dialog').getData();
    Object.getOwnPropertyNames(oDialogData).forEach(function(d) {
         oDialogData[d] = 
     });

   dialogModel.setData(oDialogData);
   oDialog.close();
   oDialog.destroy();
},
/***********************************/
一,。 在destory()之后忘记设置未定义

二,。 此对话框用于在不同视图中重用的表中,tableview id应设置为不同

//view 1
<mvc:XMLView id="modifyTableView" viewName="xxx.view.AssignTable"/>
//view 2
<mvc:XMLView id="detailTableView" viewName="xxx.view.AssignTable"/>
//视图1
//视图2
这样,
oView.getId()
就不会在不同的控制器中生成相同的id

/***********************************/
onOpenAddEmployeeDialog: function () {
    var oView = self.getView()
    var oDialog = oView.byId('addEmployeeFragment');

    if ((oDialog = !null)) {
       var oDialog = sap.ui.xmlfragment(oView.getId(), 'sap.ui.view.AddEmployeeFragment'
       oView.addDependent(oDialog);
    }

    var dialogModel = new JSONModel();
    oDialog.setModel(dialogModel, 'dialog');
    oDialog.open();

},
/***********************************/           


/***********************************/
 dialogAfterClose: function () {
    var oView = self.getView()
    var oDialog = oView.byId('addEmployeeFragment');

    //clear dialog Data
    var oDialogData = oDialog.getModel('dialog').getData();
    Object.getOwnPropertyNames(oDialogData).forEach(function(d) {
         oDialogData[d] = 
     });

   dialogModel.setData(oDialogData);
   oDialog.close();
   oDialog.destroy();
},
/***********************************/
*AddEmployee.fragment.xml

<core:FragmentDefinition
  xmlns:core="sap.ui.core" xmlns:m="sap.m"
  xmlns="sap.ui.layout.form"
  xmlns:l="sap.ui.layout">
  <m:Dialog id="addEmployeeFragment"  afterClose="dialogAfterClose" title="Add Employee" contentWidth="500px" contentHeight="600px">
    <m:content>
      <Form editable="true">
        <FormContainer>
            <FormElement label="Actual Entrance Time">
              <fields>
                <m:TimePicker
                  id="empAEDTP1"
                  value="{dialog>/actualStartTime}"
                  valueFormat="HH:mm"
                  minutesStep="5"
                  displayFormat="HH:mm"
                  change="handleChange"/>
              </fields>
            </FormElement>
            <FormElement label="Actual Exit Time">
              <fields>
                <m:TimePicker
                  id="empAEDTP2"
                  value="{dialog>/actualEndTime}"
                  valueFormat="HH:mm"
                  displayFormat="HH:mm"
                  minutesStep="5"
                  change="handleChange"/>
              </fields>
            </FormElement>
            <FormElement label="Note">
              <fields>
                <m:Input value="{dialog>/note}"></m:Input>
              </fields>
            </FormElement>
          </formElements>
        </FormContainer>
        <layout>
          <ResponsiveGridLayout/>
        </layout>
      </Form>
    </m:content>
    <m:endButton>
      <m:Button type="Accept" text="Save" icon="sap-icon://add" press="onSaveEmployee" />
    </m:endButton>
    <m:beginButton>
      <m:Button type="Reject" text="Cancel" icon="sap-icon://cancel" press="dialogAfterClose" />
    </m:beginButton>
  </m:Dialog>
</core:FragmentDefinition>

*AddEmployee.fragment.xml

<core:FragmentDefinition
  xmlns:core="sap.ui.core" xmlns:m="sap.m"
  xmlns="sap.ui.layout.form"
  xmlns:l="sap.ui.layout">
  <m:Dialog id="addEmployeeFragment"  afterClose="dialogAfterClose" title="Add Employee" contentWidth="500px" contentHeight="600px">
    <m:content>
      <Form editable="true">
        <FormContainer>
            <FormElement label="Actual Entrance Time">
              <fields>
                <m:TimePicker
                  id="empAEDTP1"
                  value="{dialog>/actualStartTime}"
                  valueFormat="HH:mm"
                  minutesStep="5"
                  displayFormat="HH:mm"
                  change="handleChange"/>
              </fields>
            </FormElement>
            <FormElement label="Actual Exit Time">
              <fields>
                <m:TimePicker
                  id="empAEDTP2"
                  value="{dialog>/actualEndTime}"
                  valueFormat="HH:mm"
                  displayFormat="HH:mm"
                  minutesStep="5"
                  change="handleChange"/>
              </fields>
            </FormElement>
            <FormElement label="Note">
              <fields>
                <m:Input value="{dialog>/note}"></m:Input>
              </fields>
            </FormElement>
          </formElements>
        </FormContainer>
        <layout>
          <ResponsiveGridLayout/>
        </layout>
      </Form>
    </m:content>
    <m:endButton>
      <m:Button type="Accept" text="Save" icon="sap-icon://add" press="onSaveEmployee" />
    </m:endButton>
    <m:beginButton>
      <m:Button type="Reject" text="Cancel" icon="sap-icon://cancel" press="dialogAfterClose" />
    </m:beginButton>
  </m:Dialog>
</core:FragmentDefinition>


当重新打开对话框的
重复id
时,它返回
添加具有重复id的元素?。如果是,则只需创建一次对话框并使用相同的对话框实例。对话框中元素的Id重复,似乎Destrory()没有清除对话框?
destroy()
将清除对话框的内容,而不是对话框。根据您共享的链接,您需要按照相同的方式使用相同的对话框实例。使用控制器保存对话框实例,如
this.\u oDailog
。但是如何使用相同的对话框实例清除数据/内容?所以我应该放弃
destroy
?当重新打开对话框的
duplicate id
时,它返回
添加具有重复id的元素?。如果是,则只需创建一次对话框并使用相同的对话框实例。对话框中元素的Id重复,似乎Destrory()没有清除对话框?
destroy()
将清除对话框的内容,而不是对话框。根据您共享的链接,您需要按照相同的方式使用相同的对话框实例。使用控制器保存对话框实例,如
this.\u oDailog
。但是如何使用相同的对话框实例清除数据/内容?所以我应该放弃
destroy
?我从这个链接中受益:我从这个链接中受益:这是否回答了你的问题?从运行代码段。不建议使用当前接受的答案,因为每次创建和销毁ManagedObject(对话框)的成本相当高。只需重复使用现有对话框。关于“无法读取null的属性'setInitialFocusId'”->请参阅这是否回答了您的问题?从运行代码段。不建议使用当前接受的答案,因为每次创建和销毁ManagedObject(对话框)的成本相当高。只需重用现有对话框。关于“无法读取null的属性'setInitialFocusId'”->请参阅