So two separate ideas here, right? First is hiding the DataBinder
(yes!) and the second is declarative change handlers for model updates.
Both are great ideas. So +1 to both.
The only thought I had on the declarative model change handler bit was
to have an *option* to be more specific with the declaration. In other
words, I might only care about one or two properties in my model. And I
might have very different logic that I want to perform for the different
properties. So it might be nice to target a single property name when
creating the change handler. Perhaps:
@OnModelChange(propertyName="firstName")
public void onMyModelChange(@OldModel MyModel model,
@NewModel MyModel newModel,
@Source Object source)
{
// Perform name-change logic here
}
@OnModelChange(propertyName="dob")
public void onMyModelChange(@OldModel MyModel model,
@NewModel MyModel newModel,
@Source Object source)
{
// Perform date of birth change logic here
}
Alternatively it could be:
@OnModelChange(properties={"firstName", "dob"})
And then method signature could remain the same.
-Eric
On 03/11/2013 08:42 PM, Mike Brock wrote:
> This gets us a little closer to something like this:
>
> @Singleton
> public class MyBean {
> @Inject @AutoBound MyModel model;
> @Inject @Bound Label name;
>
> public void onMyModelChange(@NewModel MyModel updatedModel) {
> // do something with updatedModel
> }
>
> @ModelSetter
> public void setModel(MyModel model) {
> this.model = model;
> }
> }
>
> Note that I didn't inject a DataBinder<T> but rather the MyModel directly.
> Also pay attention to the @ModelSetter annotation. The theory behind this is
> the DataBinder<T> would be created in the Bootstrapper but never actually
> injected. The @ModelSetter is a hint to create decorator code that proxies
> that method so the hidden DataBinder's setModel() method can be called, and
> then the proxied model object then passed on to the MyBean.setModel(). This
> requires AOP-style parodying of the MyBean in this case. But I think it's a
> powerful tradeoff.
>
> Mike.
>
> On 2013-03-11, at 8:33 PM, Mike Brock <[email protected]> wrote:
>
>> 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.
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> errai-dev mailing list
>> [email protected]
>> https://lists.jboss.org/mailman/listinfo/errai-dev
>
>
> _______________________________________________
> errai-dev mailing list
> [email protected]
> https://lists.jboss.org/mailman/listinfo/errai-dev
>
_______________________________________________
errai-dev mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/errai-dev