Shared Bindings

Since each page contains it’s own bindings, If you need to reuse parts of layout with their own handlers, you can put the bindings in a list and copy it on each pages.

Example with an header included on two pages

header.py
from dazzler.components import core
from dazzler.system import Binding, Trigger

def header(title):
    return core.Container([
        core.Html(2),
        core.Button('Shared click', identity='shared-btn'),
        core.Container(identity='shared-output', class_name='row')
    ], class_name='row')


async def on_load(ctx):
    shared_clicks = await ctx.session.get('shared_clicks')
    await ctx.set_aspect('shared-output', children=shared_clicks)

async def on_click(ctx):
    shared_clicks = await ctx.session.get('shared_clicks')
    shared_clicks += 1
    await ctx.session.set('shared_clicks', shared_clicks)
    await ctx.set_aspect('shared-output', children=shared_clicks)

# Since there is no page yet, we can store the bindings
# in a list and use the object based Binding wrapper.
header_bindings = [
    Binding(Trigger('shared-output', 'class_name'))(on_load),
    Binding(Trigger('shared-btn', 'clicks'))(on_clicks)
]
page1.py
from dazzler.components import core
from dazzler.system import Page

from .header import header, header_bindings

page = Page(
    __name__,
    core.Container([
        header('Page 1'),
        core.Container('page one content')
    ]),
    # It is important to copy the list.
    # Other it will be shared across pages and all bindings
    # will be added to the same list.
    bindings=header_bindings.copy()
)

Repeat for any page where you want the header included.