There are two things there:
The way the components pass the objects is fine - now you have to make
sure, for example, that address is not null. Hope I got that right.
If you decide this logic belongs to the UI...
placing it in pageBeginRender is a bad idea - Its hard to explain why...
I use pageBeginRender to initialize rendering cycle, but not business or
domain logic.
What I would do is make proxy methods:
on the page:
public Address getAddress() {
Address a = getClient().getAddress();
if (a == null) {
a = new Address();
getClient().setAddress(a);
}
return a;
}
This is the same code you would have used in pageBeginRender method of
your component.
I Like it better because the component gets an Address. Its the
responsibility of the container to make sure it gets one.
Otherwise, the component gets a client, and manipulates it, which
interfears (logically, not necesserily practically) with the "work" of
the container.
Hope its not topo fuzzy...
Cheers,
Ron
ציטוט Leonardo Quijano Vincenzi:
Just how would you make it lazy??
My scenario: a domain-driven approach to web development. I have several
domain classes, such as Client, Phone, Address, etc. For example, the
Client class would have something like this:
Client.java
-> String firstName
-> String lastName
-> List<Phone> phones
-> Address address
etc
I then go and create a FormClient.html Tapestry component with something
like this:
<span jwcid="@FieldLabel" displayName="First Name" /><span
jwcid="@TextField" value="ognl:value.firstName" />
<span jwcid="@FieldLabel" displayName="Last Name" /><span
jwcid="@TextField" value="ognl:value.lastName" />
<span jwcid="@For" source="ognl:value.phones" value="ognl:phone">
<span jwcid="@forms/FormPhone" value="ognl:phone" />
</span>
<span jwcid="@forms/FormAddress" value="ognl:value.address" />
etc...
As you see, I'm binding the subcomponents (FormPhone, FormAddress) with
the Client object directly. Then on rewind I have to do nothing: the
address is automatically assigned to value.address and so forth (the
list of phones is a special case, but similar).
Now, the graph can get pretty complex, so I initialize every FormXXX
component's value (in case it's null) in pageBeginRender. But, for this
to work, the parent component must be already initialized, because, if I
try to do a setValue() on "value.address", it throws an NPE when and
value is null (since the parent hasn't been initialized yet).
Summary: It's just a case of component composition. It's like using
constructors. The object's fields constructors are called after the
parent one.
It's intuitive to assume events are fired in order [parent -> child]. At
least it took me a while to figure out what was going wrong.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]