我第一次打开ValueHelpDialog并选择了一个项目没有错误。但是,当我再次打开对话框并单击相同的条目时,我收到以下错误:
未捕获错误:错误:添加具有重复ID的元素 'EQ5IPAKCZJMZR' 在constructor.x.registerElement(Core-dbg.js:2711)......
当我再次点击时,我得到另一个错误:
未捕获的TypeError:无法读取未定义的属性“getKey” 在constructor.onVHOK(ValueHelper.js?eval:35)...
当我第三次点击它时没有错误。
我用
this._dialog.close();
this._dialog.destroy();
在ok事件和cancel事件的事件处理程序中。
第二个错误与第一个错误有关吗?我认为关闭和销毁对话框足以避免那些重复的id错误。
编辑:更多代码 控制器:
this._ValueHelper = new ValueHelper();
/* Calling valueHelper */
onVH: function(oEvent) {
this._ValueHelper.handleValueHelp(this, {
srcCtrl: oEvent.getSource()
});
},
ValueHelper.js:
handleValueHelp: function(oController, mOptions) {
if (mOptions == null) {
mOptions = {};
}
this._controller = oController;
this._view = oController.getView();
this._model = this._controller.getModel();
this._callback = mOptions.fnCallback;
this._srcCtrl = mOptions.srcCtrl;
if (this._dialog != null) {
this._dialog.open();
} else {
this._buildValueHelp();
}
},
_buildValueHelp: function() {
var oDialog = sap.ui.xmlfragment(
"xxx.view.fragments.valueHelper.ValueHelp",
this
);
this._view.addDependent(oDialog);
this._dialog = oDialog;
this._registerEnterEvent(oDialog);
var oTable = sap.ui.xmlfragment(
"xxx.view.fragments.valueHelper.ValueHelpTable",
this
);
this._table = oTable;
oDialog.setTable(oTable);
oDialog.open();
},
onVHOK: function(oEvent) {
var sId = oEvent.getParameter("tokens")[0].getKey();
this._handleOk(sId);
this._dialog.close();
/*this._dialog.destroy();*/
},
onVHClose: function() {
this._dialog.close();
/*this._dialog.destroy();*/
},
ValueHelp.fragment:
<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core" xmlns:vh="sap.ui.comp.valuehelpdialog" xmlns:fb="sap.ui.comp.filterbar">
<vh:ValueHelpDialog key="id" ok="onVHOK" cancel="onVHClose" selectionChange="onVHSelectionChange"
title="Car" supportMultiselect="false" supportRanges="false" supportRangesOnly="false" descriptionKey="Car">
<vh:filterBar>
<fb:FilterBar advancedMode="true" filterBarExpanded="true" search="onVHShipSearch">
<fb:filterGroupItems>
<fb:FilterGroupItem groupName="car" name="n1" label="Name">
<fb:control>
<Input />
</fb:control>
</fb:FilterGroupItem>
<fb:FilterGroupItem groupName="car" name="n2" label="imnr">
<fb:control>
<Input/>
</fb:control>
</fb:FilterGroupItem>
</fb:filterGroupItems>
</fb:FilterBar>
</vh:filterBar>
</vh:ValueHelpDialog>
</core:FragmentDefinition>
ValueHelpTable.fragment:
<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core" xmlns:t="sap.ui.table">
<t:Table rows="{path: '/Cars'}" selectionBehavior="Row" selectionMode="Single">
<t:columns>
<t:Column>
<t:label>
<Label text="Number"/>
</t:label>
<t:template>
<Text text="{ path: 'number', formatter: '.formatter.leadingZeroes' }"/>
</t:template>
</t:Column>
<t:Column>
<t:label>
<Label text="Name"/>
</t:label>
<t:template>
<Text text="{name}"/>
</t:template>
</t:Column>
<t:Column>
<t:label>
<Label text="imnr"/>
</t:label>
<t:template>
<Text text="{imnr}"/>
</t:template>
</t:Column>
</t:columns>
</t:Table>
</core:FragmentDefinition>
答案 0 :(得分:1)
通常,它是。但该对话框可能仍被其他元素引用。在这种情况下,你可以......:我认为关闭并销毁对话框足以避免重复的id错误。
尝试在销毁之前删除所有参考持有者的参考文献
例如,如果视图的<dependents>
聚合中包含对话框:
this._dialog.attachEventOnce("afterClose", function() {
this.getView().removeDependent(this._dialog)/*returns removed element*/.destroy();
}.bind(this)).close();
但我不知道找到所有参考持有人的任何有效方法。因此......
仔细检查每次关闭后是否真的需要销毁对话框。这种尝试通常是过早优化的标志。只要没有memory issue,我就会将对话框保留在内存中,以便下次可以快速打开。
如果您因其他原因破坏了对话框,请将其添加到您的问题中。
答案 1 :(得分:0)
我遇到了同样的问题并通过做出这一系列选择来解决它。
closeIndicator: function(oEvent) {
this._dialog.close(); // First: close fragment
this._dialog.destroy(); //Second: destoy fragment
this._dialog=null; // Third: null name/pointer
},
问题在于,当你执行破坏时,你不会使变量无效。