如何将具有相同 ID 的元素重新插入 sap.m.Page?
How to re-insert element with same id into sap.m.Page?
我想删除页面的所有内容并通过单击按钮将不同的内容插入其中。
不幸的是,有些内容是相同的,因此具有相同的 id。
我预计这不会成为问题,因为我从不尝试两次插入相同的元素。我想在重新插入之前删除它。
但显然我发现的方法:oPage.removeAllContent();
和 oPage.destroyContent();
实际上并没有完全删除旧内容,因为我仍然遇到错误,我试图添加一个元素重复的 ID:
Error: adding element with duplicate id 'text'
我怎样才能删除旧内容,以便实际上忘记旧 ID,然后我可以重新插入它们?
这是一个最小的例子(点击 Reload
按钮两次,第二次错误将出现在控制台中):
https://jsfiddle.net/1Lqc36uh/
这是最相关(我认为)的部分:
let oPage = this.byId(this.detailId);
oPage.removeAllContent();
oPage.destroyContent();
if (bSetText) {
oPage.insertContent(new sap.m.Text(this.textId, {
text: "SetText"
}));
} else {
oPage.insertContent(new sap.m.Text(this.textId, {
text: "Test"
}));
}
你真的需要给每个元素一个ID吗?在 UI5 中,大多数事情都可以在没有 ID 的情况下完成。通常 JSONModel
是控制 UI 元素的更好方法。
例如,您可以使第一个元素可见而第二个元素不可见(即使在 JSONModel 中使用相同的 属性,因此两个元素都会自动切换)。
话虽如此,您可以自行销毁删除的元素。
oPage
.removeAllContent()
.forEach(oControl => { oControl.destroy(); });
编辑:你可以不接受这个答案,@Boghyon 好像给了一个更好的答案。
删除行 oPage.removeAllContent();
.
问题是您正在删除内容然后试图销毁它:
oPage.removeAllContent(); // removes the existing content (without destroying it).
oPage.destroyContent(); // tries to destroy but there is no content!
ManagedObject 方法 destroyXYZ()
依赖于子控件首先作为聚合的一部分存在的事实。
通过 removeAllXYZ()
删除控件确实将它们从 UI 中删除并使它们不再与父级相关,但它们没有被破坏并且仍在控件注册表中。因此,“重复 ID”错误。
方法 destroyContent()
足以从控件注册表中删除 UI 和 的内容。
我想删除页面的所有内容并通过单击按钮将不同的内容插入其中。
不幸的是,有些内容是相同的,因此具有相同的 id。
我预计这不会成为问题,因为我从不尝试两次插入相同的元素。我想在重新插入之前删除它。
但显然我发现的方法:oPage.removeAllContent();
和 oPage.destroyContent();
实际上并没有完全删除旧内容,因为我仍然遇到错误,我试图添加一个元素重复的 ID:
Error: adding element with duplicate id 'text'
我怎样才能删除旧内容,以便实际上忘记旧 ID,然后我可以重新插入它们?
这是一个最小的例子(点击 Reload
按钮两次,第二次错误将出现在控制台中):
https://jsfiddle.net/1Lqc36uh/
这是最相关(我认为)的部分:
let oPage = this.byId(this.detailId);
oPage.removeAllContent();
oPage.destroyContent();
if (bSetText) {
oPage.insertContent(new sap.m.Text(this.textId, {
text: "SetText"
}));
} else {
oPage.insertContent(new sap.m.Text(this.textId, {
text: "Test"
}));
}
你真的需要给每个元素一个ID吗?在 UI5 中,大多数事情都可以在没有 ID 的情况下完成。通常 JSONModel
是控制 UI 元素的更好方法。
例如,您可以使第一个元素可见而第二个元素不可见(即使在 JSONModel 中使用相同的 属性,因此两个元素都会自动切换)。
话虽如此,您可以自行销毁删除的元素。
oPage
.removeAllContent()
.forEach(oControl => { oControl.destroy(); });
编辑:你可以不接受这个答案,@Boghyon 好像给了一个更好的答案。
删除行 oPage.removeAllContent();
.
问题是您正在删除内容然后试图销毁它:
oPage.removeAllContent(); // removes the existing content (without destroying it). oPage.destroyContent(); // tries to destroy but there is no content!
ManagedObject 方法 destroyXYZ()
依赖于子控件首先作为聚合的一部分存在的事实。
通过 removeAllXYZ()
删除控件确实将它们从 UI 中删除并使它们不再与父级相关,但它们没有被破坏并且仍在控件注册表中。因此,“重复 ID”错误。
方法 destroyContent()
足以从控件注册表中删除 UI 和 的内容。