diff --git a/panel/models/reactive_html.ts b/panel/models/reactive_html.ts
index ca2d45f8a4..55b1ee1802 100644
--- a/panel/models/reactive_html.ts
+++ b/panel/models/reactive_html.ts
@@ -195,8 +195,10 @@ export class ReactiveHTMLView extends PanelHTMLBoxView {
after_layout(): void {
super.after_layout()
- for (const child_view of this.child_views)
+ for (const child_view of this.child_views) {
+ child_view.resize_layout()
this._align_view(child_view)
+ }
}
private _align_view(view: any): void {
diff --git a/panel/pane/base.py b/panel/pane/base.py
index aeb18115b9..2b879ff3c9 100644
--- a/panel/pane/base.py
+++ b/panel/pane/base.py
@@ -11,6 +11,7 @@
from ..io import init_doc, push, state, unlocked
from ..layout import Panel, Row
from ..links import Link
+from ..models import ReactiveHTML as _BkReactiveHTML
from ..reactive import Reactive
from ..viewable import Layoutable, Viewable
from ..util import param_reprs
@@ -159,6 +160,13 @@ def _update_object(self, ref, doc, root, parent, comm):
else:
raise ValueError
new_model = (new_model,) + parent.children[index][1:]
+ elif isinstance(parent, _BkReactiveHTML):
+ for node, children in parent.children.items():
+ if old_model in children:
+ index = children.index(old_model)
+ new_models = list(children)
+ new_models[index] = new_model
+ break
else:
index = parent.children.index(old_model)
except ValueError:
@@ -168,7 +176,10 @@ def _update_object(self, ref, doc, root, parent, comm):
'time the panel is being updated.' %
(type(self).__name__, old_model, new_model))
else:
- parent.children[index] = new_model
+ if isinstance(parent, _BkReactiveHTML):
+ parent.children[node] = new_models
+ else:
+ parent.children[index] = new_model
from ..io import state
ref = root.ref['id']
diff --git a/panel/reactive.py b/panel/reactive.py
index d9e22213f0..8f92a1d743 100644
--- a/panel/reactive.py
+++ b/panel/reactive.py
@@ -1118,9 +1118,12 @@ def _init_params(self):
return params
def _get_events(self):
- events = {
- node: {e: True for e in events} for node, events in self._dom_events.items()
- }
+ events = {}
+ for node, node_events in self._dom_events.items():
+ if isinstance(node_events, list):
+ events[node] = {e: True for e in node_events}
+ else:
+ events[node] = node_events
for node, evs in self._event_callbacks.items():
events[node] = node_events = events.get(node, {})
for e in evs:
@@ -1219,15 +1222,16 @@ def _set_on_model(self, msg, root, model):
del self._changing[root.ref['id']]
def _update_model(self, events, msg, root, model, doc, comm):
+ child_params = self._parser.children.values()
model_msg = {
prop: msg.pop(prop) for prop, v in list(msg.items())
- if prop in self._parser.children.values()
+ if prop in child_params or prop in Reactive.param
}
if model_msg:
- old_children = {key: events[key].old for key in model_msg}
- model_msg = {
- 'children': self._get_children(doc, root, model, comm, old_children)
- }
+ old_children = {key: events[key].old for key in model_msg if key in child_params}
+ children = self._get_children(doc, root, model, comm, old_children)
+ model_msg = {p: model_msg.pop(p) for p in Reactive.param if p in model_msg}
+ model_msg = dict(model_msg, children=children)
self._set_on_model(model_msg, root, model)
if not msg:
return