diff --git a/panel/layout/card.py b/panel/layout/card.py index 60e4235d18..17fd877795 100644 --- a/panel/layout/card.py +++ b/panel/layout/card.py @@ -57,6 +57,7 @@ def __init__(self, *objects, **params): self._header_layout = Row(css_classes=['card-header-row'], sizing_mode='stretch_width') super().__init__(*objects, **params) + self._header = None self.param.watch(self._update_header, ['title', 'header', 'title_css_classes']) self._update_header() @@ -76,12 +77,20 @@ def _process_param_change(self, params): def _update_header(self, *events): from ..pane import HTML, panel if self.header is None: - item = HTML('%s' % (self.title or "​"), - css_classes=self.title_css_classes, - sizing_mode='stretch_width', - margin=(2, 5)) + params = { + 'object': '%s' % (self.title or "​"), + 'css_classes': self.title_css_classes + } + if self._header is not None: + self._header.param.set_param(**params) + return + else: + self._header = item = HTML( + sizing_mode='stretch_width', margin=(2, 5), **params + ) else: item = panel(self.header) + self._header = None self._header_layout[:] = [item] def _get_objects(self, model, old_objects, doc, root, comm=None): diff --git a/panel/template/base.py b/panel/template/base.py index ecf58cc6a6..449c3d0722 100644 --- a/panel/template/base.py +++ b/panel/template/base.py @@ -148,6 +148,7 @@ def _init_doc(self, doc=None, comm=None, title=None, notebook=False, location=Tr preprocess_root = col.get_root(doc, comm) col._hooks.append(self._apply_hooks) ref = preprocess_root.ref['id'] + objs = [] for name, (obj, tags) in self._render_items.items(): if self._apply_hooks not in obj._hooks: @@ -163,17 +164,18 @@ def _init_doc(self, doc=None, comm=None, title=None, notebook=False, location=Tr sub._models[ref] = submodel if isinstance(sub, HoloViews) and mref in sub._plots: sub._plots[ref] = sub._plots.get(mref) - col.objects.append(obj) obj._documents[doc] = model model.name = name model.tags = tags self._apply_root(name, model, tags) add_to_doc(model, doc, hold=bool(comm)) + objs.append(obj) # Here we ensure that the preprocessor is run across all roots # and set up session cleanup hooks for the fake root. state._fake_roots.append(ref) state._views[ref] = (col, preprocess_root, doc, comm) + col.objects = objs col._preprocess(preprocess_root) col._documents[doc] = preprocess_root doc.on_session_destroyed(col._server_destroy)