diff --git a/zktest/src/archive/test2/B-ZK-4970.zul b/zktest/src/archive/test2/B-ZK-4970.zul
new file mode 100644
index 00000000000..5a6c58f5211
--- /dev/null
+++ b/zktest/src/archive/test2/B-ZK-4970.zul
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/zktest/src/org/zkoss/zktest/test2/B4970Composer.java b/zktest/src/org/zkoss/zktest/test2/B4970Composer.java
new file mode 100644
index 00000000000..08b9f36d42d
--- /dev/null
+++ b/zktest/src/org/zkoss/zktest/test2/B4970Composer.java
@@ -0,0 +1,52 @@
+/* B4970Composer.java
+
+ Purpose:
+
+ Description:
+
+ History:
+ Fri Jul 23 10:39:38 CST 2021, Created by rudyhuang
+
+Copyright (C) 2021 Potix Corporation. All Rights Reserved.
+*/
+package org.zkoss.zktest.test2;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.zkoss.zk.ui.Executions;
+import org.zkoss.zk.ui.event.Events;
+import org.zkoss.zk.ui.util.Composer;
+import org.zkoss.zul.Button;
+import org.zkoss.zul.Div;
+import org.zkoss.zul.ListModelList;
+import org.zkoss.zul.Listbox;
+import org.zkoss.zul.ListitemRenderer;
+
+/**
+ * @author rudyhuang
+ */
+public class B4970Composer implements Composer
{
+ private Div div;
+
+ @Override
+ public void doAfterCompose(Div comp) throws Exception {
+
+ Button button = new Button("create");
+ comp.appendChild(button);
+
+ button.addEventListener("onClick", event -> {
+ div = (Div) Executions.createComponentsDirectly(
+ "
", "zul",
+ null,
+ Collections.singletonMap("innerComposer", (Composer
) div2 -> {
+ div2.addEventListener("onInitModel", event2 -> {
+ Listbox listbox = (Listbox) div2.getFirstChild();
+ listbox.setModel(new ListModelList<>(Arrays.asList("aaa", "bbb", "ccc")));
+ listbox.setItemRenderer((ListitemRenderer) (item, data, index) -> item.setLabel(data));
+ });
+ Events.postEvent("onInitModel", div2, null);
+ }));
+ });
+ }
+}
\ No newline at end of file
diff --git a/zktest/test/java/org/zkoss/zktest/zats/test2/B_ZK_4970Test.java b/zktest/test/java/org/zkoss/zktest/zats/test2/B_ZK_4970Test.java
new file mode 100644
index 00000000000..e8ed753c1a1
--- /dev/null
+++ b/zktest/test/java/org/zkoss/zktest/zats/test2/B_ZK_4970Test.java
@@ -0,0 +1,32 @@
+/* B_ZK_4970Test.java
+
+ Purpose:
+
+ Description:
+
+ History:
+ Fri Jul 23 10:59:52 CST 2021, Created by rudyhuang
+
+Copyright (C) 2021 Potix Corporation. All Rights Reserved.
+*/
+package org.zkoss.zktest.zats.test2;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.zkoss.zktest.zats.WebDriverTestCase;
+
+/**
+ * @author rudyhuang
+ */
+public class B_ZK_4970Test extends WebDriverTestCase {
+ @Test
+ public void test() {
+ connect();
+
+ click(jq("@button"));
+ waitResponse();
+
+ Assert.assertEquals(3, jq("@listitem").length());
+ }
+}
diff --git a/zul/src/org/zkoss/zul/impl/ListboxDataLoader.java b/zul/src/org/zkoss/zul/impl/ListboxDataLoader.java
index 0e6dc9c1b20..d63b3bdc574 100644
--- a/zul/src/org/zkoss/zul/impl/ListboxDataLoader.java
+++ b/zul/src/org/zkoss/zul/impl/ListboxDataLoader.java
@@ -178,6 +178,7 @@ else if (max < 0)
private void invalidateListitems() {
//Bug 3147518: avoid memory leak
//Also better performance (outer better than remove a lot)
+ if (!_listbox.isInitialized()) return;
final Execution execution = Executions.getCurrent();
final String uuid = _listbox.getUuid();
final boolean isDeferInitModel = execution != null && execution.getAttribute("zkoss.Listbox.deferInitModel_" + uuid) != null;