ValueHelpDialog错误添加具有重复ID的元素

时间:2018-03-08 09:20:57

标签: sapui5

我第一次打开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>

2 个答案:

答案 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 
    },

问题在于,当你执行破坏时,你不会使变量无效。