# Use an external model with solara
import solara
import traitlets
# our own model class, that is observable
class Model:
def __init__(self, value):
self._value = value
self._event_listeners = []
@property
def value(self):
return self._value
@value.setter
def value(self, new_value):
self._value = new_value
self._fire()
def _fire(self):
print("fire events")
for c in self._event_listeners:
c()
def observe(self, callback):
def remove():
self._event_listeners.remove(callback)
self._event_listeners.append(callback)
return remove
model = Model(42)
@solara.component
def ModelVisualizer(model):
# forcing update feature
update_counter = solara.use_reactive(0)
update_counter.get() # force this component to be a dependency of update_counter
def force_update():
print("force update")
update_counter.value += 1
# connect/disconnect to model
def connect_to_model():
# note that the return value will be called to cleanup the
# event handler
return model.observe(force_update)
solara.use_effect(connect_to_model, [model])
# model.value is not reactive, but the above code forces rerenders on mutations
solara.Text(f"Model.value = {model.value}")
@solara.component
def Page():
ModelVisualizer(model)
# 'external' mutation
def increase():
model.value += 1
solara.Button("Mutate model", on_click=increase)