While I was playing tonight I had a few ideas I wanted to bounce off everyone. What about
a higher level API for handling change events?
Consider the following:
====HelloWorld.java=========================================
@EntryPoint
@Templated("#root")
public class HelloWorld extends Composite {
@Inject @AutoBound private DataBinder<MyModel> model;
@Inject @NeedsData @Bound @DataField private TextBox name;
@Inject @DataField private Button button;
@EventHandler("button")
private void onClick(ClickEvent e) {
messageBox.setText("Hello there, " + model.getModel().getName());
}
@OnModelChange
public void onMyModelChange(@OldModel MyModel model,
@NewModel MyModel
newModel,
@Property String propertyName,
@Source Object source) {
// react to change
}
}
----------------------------------------------------------------------------------------------------
====ChangeEvents.java======================================
@Singleton
public class ChangeEvents [
@OnGlobalModelChange
public void onMyModelChange(@OldModel MyModel model,
@NewModel MyModel
newModel,
@Property String propertyName,
@Source Object source) {
// react to change
}
}
----------------------------------------------------------------------------------------------------
Note: the idea is that each of the specified attributes are optional with the exception
you must specify *at least* @OldModel or @NewModel. So in practice you might just do
something like this:
public void onMyModelChange(@NewModel MyModel updatedModel) {
// do something with updatedModel
}
The general idea is that the @ OnGlobalModelChange would match all *managed* (read:
injected automatically by the container such as @AutoBound) DataBinders that match
MyModel. Where-as the @OnModelChange in the HelloWorld class would be scoped just to that
one ErraiUI bean.
----
This is just something I brainstormed in about 15 minutes. I am not fixed on this
particular approach. But I found myself wanting a declarative way of listening for changes
tonight that didn't involve me adding a @PostConstruct and manually adding a
PropertyChangeHandler to the DataBinder.