We've reworked the implementation a bit,it works like this:
SafePropertyModel<Person> p = new SafePropertyModel<Person>(new Person()); TextField field = new TextField("name", p.bind(p.property().getFirstName())); It's attached to the JIRA issue: https://issues.apache.org/jira/browse/WICKET-1327 -Matej On Tue, Feb 26, 2008 at 11:32 AM, Sebastiaan van Erk <[EMAIL PROTECTED]> wrote: > Matej Knopp wrote: > > Hi, > > > > On Tue, Feb 26, 2008 at 11:13 AM, Sebastiaan van Erk > > <[EMAIL PROTECTED]> wrote: > >> Matej Knopp wrote: > >> > model.getFirstName() can't really return IModel, if > >> > Customer.getFirstName() returns string. > >> > > >> > Anyway, I like the idea, but I don't like the syntax. instead of one > >> > line [add(new TextField("id", model).setRequred(true)) ] you have now > >> > three separate lines. > >> > > >> > So I was thinking of something more like > >> > > >> > SafePropertyModel<Customer> model = new > SafePropertyModel<Customer>(customer); > >> > > >> > add(new TextField("tf", model.bind(model.proxy().getCustomerName() > >> > )).setRequired(true)); > >> > > >> > This way you can have it one one line. > >> > > >> > -Matej > >> > >> So proxy() returns a Customer proxy? > >> > >> And model.bind() takes an Object argument (considering we don't know in > >> advance what type getCustomerName() returns)... What about primitive > >> types? Overload bind() for those as well? > > Well, the return object is not important at all. What is important is > > the getCustomerName() call. That marks somewhere in the model that > > last accessed property was called "customerName". and then immediately > > after this model.bind takes this information. > > OK, that's what I described. :-) And I was being stupid with respect to > the overloading. If bind takes an object as argument, then overloading > will not be necessary due to autoboxing. :-) > > > >> And the call to getCustomerName() has the side effect of setting a model > >> object somewhere (e.g., in an instance field of model) which > >> model.bind() can subsequently return? > > Model bind will return a model (variation of propertymodel probably). > > It will take the information that getCustomerName call on proxy > > provided. > > Ok, so the proxy remembers which getter was called last, and you use > that to construct the model in bind(). Of course. > > > >> Very interesting. I don't like the proxy() method name though. If you > >> call it something like property() it will look more like you're binding > >> to a property of Customer: > > Well, the naming can certainly be improved. I'm not sure about > > "property()" though. Well, we can discuss this more anyway. > >> model.bind(model.property().getCustomerName()) > > Neither am I. :-) For one, it's quite long. But on the other hand, you > do bind to a model property, and so it reads ok. I think that proxies > should be "invisible" for general users, so they shouldn't have to > understand the magic going on here, nor that proxies are involved. > > > >> VERY neat idea though... :-) > > Thanks. > > What I really like about this solution is that it can be implemented > completely separately from wicket-core, so you can just put it in it's > own project. :-) > > Regards, > Sebastiaan > > > > > -Matej > >> Regards, > >> Sebastiaan > >> > >> > >> > >> > > >> > On Fri, Feb 8, 2008 at 6:17 PM, Johan Compagner <[EMAIL PROTECTED]> > wrote: > >> >> don't worry about creating the models > >> >> That will happen anyway in 1.3 (that needs to be done for example to > get the > >> >> right object especially when we generify stuff) > >> >> > >> >> see CompoundPropertyModel.wrapOnInheritance() > >> >> > >> >> joan > >> >> > >> >> > >> >> > >> >> > >> >> > >> >> On Feb 8, 2008 5:41 PM, Scott Swank <[EMAIL PROTECTED]> wrote: > >> >> > >> >> > Interesting. So > >> >> > > >> >> > model.getFirstName() > >> >> > > >> >> > would return a PropetyModel based on the results of proxy.eval()? > If > >> >> > I understand you correctly that creates many models (one per > >> >> > component) instead of reusing a single model, but that may well > not be > >> >> > the end of the world. Or does getFirstName() return a > CompoundModel > >> >> > that is properly bound this this component? Intriguing none the > less. > >> >> > I hadn't considered this option, but I'm going to play with it a > bit. > >> >> > I rather like that direction. > >> >> > > >> >> > > >> >> > On Feb 8, 2008 8:29 AM, Johan Compagner <[EMAIL PROTECTED]> wrote: > >> >> > > i try to look at this this weekend, but i have a quick question > >> >> > > I find it a bit verbose can't it be a bit shorter like this > (just an > >> >> > > example) > >> >> > > > >> >> > > SharedPropertyModel<Customer> model = new > >> >> > > SharedPropertyModel<Customer>(customer); > >> >> > > this.setModel(model); > >> >> > > > >> >> > > FormComponent firstName = new CustomerNameField("firstName", > >> >> > > model.getFirstName()).setRequired(true); > >> >> > > add(firstName); > >> >> > > > >> >> > > where getFirstName() returns the model > >> >> > > > >> >> > > johan > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > On Feb 6, 2008 6:57 PM, Scott Swank <[EMAIL PROTECTED]> wrote: > >> >> > > > >> >> > > > One of our more clever developers created a > CompoundPropertyModel that > >> >> > > > uses a cglib proxy to strongly bind the mutators to the model. > It > >> >> > > > looks like this: > >> >> > > > > >> >> > > > SharedPropertyModel<Customer> model = new > >> >> > > > SharedPropertyModel<Customer>(customer); > >> >> > > > this.setModel(model); > >> >> > > > > >> >> > > > FormComponent firstName = new > >> >> > > > CustomerNameField("firstName").setRequired(true); > >> >> > > > model.bind(firstName).to().getFirstName(); > >> >> > > > add(firstName); > >> >> > > > > >> >> > > > FormComponent lastName = new > >> >> > > > CustomerNameField("lastName").setRequired(true); > >> >> > > > model.bind(lastName).to().getLastName(); > >> >> > > > add(lastName); > >> >> > > > > >> >> > > > FormComponent addr1 = new > >> >> > > > AddressField("address1").setRequired(true); > >> >> > > > > model.bind(addr1).to().getAddress().getAddress1(); > >> >> > > > add(addr1); > >> >> > > > > >> >> > > > FormComponent addr2 = new > AddressField("address2"); > >> >> > > > > model.bind(addr2).to().getAddress().getAddress2(); > >> >> > > > add(addr2); > >> >> > > > > >> >> > > > FormComponent city = new CityField("city"); > >> >> > > > model.bind(city).to().getAddress().getCity(); > >> >> > > > add(city); > >> >> > > > > >> >> > > > We're happy to share if folk like this approach. N.B. that > the .to() > >> >> > > > call is for readability rather than out of any necessity. > >> >> > > > > >> >> > > > Cheers, > >> >> > > > Scott > >> >> > > > > >> >> > > > -- > >> >> > > > Scott Swank > >> >> > > > reformed mathematician > >> >> > > > > >> >> > > > >> >> > > > > --------------------------------------------------------------------- > >> >> > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > >> >> > > > For additional commands, e-mail: [EMAIL PROTECTED] > >> >> > > > > >> >> > > > > >> >> > > > >> >> > > >> >> > > >> >> > > >> >> > -- > >> >> > Scott Swank > >> >> > reformed mathematician > >> >> > > >> >> > > --------------------------------------------------------------------- > >> >> > To unsubscribe, e-mail: [EMAIL PROTECTED] > >> >> > For additional commands, e-mail: [EMAIL PROTECTED] > >> >> > > >> >> > > >> >> > >> > > >> > > >> > > >> > > > > > > > -- Resizable and reorderable grid components. http://www.inmethod.com --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]