-
1. Re: Null Value in s:link w/IceFaces
gzoller Feb 17, 2007 3:41 PM (in response to gzoller)Ok, I'm making progress solving the problem.
It turns out that you definitely do need to annotate the list in the backing bean used to populate the <ice:dataTable> with @DataModel. If you don't, even though IceFaces rendering components will see your line-item variable correctly populated, the Seam <s:link> tag won't feed the value back into Seam.
Now my next complication...
Can you successfully nest <ice:dataTable>'s w/Seam?
Here's what I have so far:
Rendering xhtml:<ice:dataTable id="departments" width="100%" cellspacing="1" value="#{outer}" var="item" rowClasses="rowClass1,rowClass2"> <ice:column> <s:link id="viewItem" value="#{item.name}" action="#{mgrBean.selectItem(item)}"/> <ice:dataTable width="100%" cellspacing="1" value="#{inner}" var="bucket" rowClasses="rowClass1,rowClass2"> <ice:column> <s:link id="viewBucket" value="#{bucket.name}" action="#{mgrBean.selectBucket(bucket)}"/> </ice:column> </ice:dataTable> </ice:column> </ice:dataTable>
ManagerBean.java@Name("mgrBean") public class ManagerBean { ... @DataModel private List<Foo> list; ... @Create public void init() { // populate list } public String selectItem(Foo foo) {...} public String selectBucket(Bar bar) {...} }
Foo.java@Name("foo") public class Foo { @DataModel private List<Bar> buckets; ... }
So it might render something like this:ONE A B TWO C THREE D E
Here's what happens: The outer table is rendered and clicking on the s:link elements for ONE, TWO, or THREE correctly passes the corresponding (non-null) objects to the backing bean (calling selectItem()).
But clicking on A-E is still passing null to selectBucket() on the backing bean (ManagerBean).
Has anyone nested these before? How about nesting non-IceFaces dataTables? -
2. Re: Null Value in s:link w/IceFaces
gzoller Feb 17, 2007 7:35 PM (in response to gzoller)Further research... the original question in the post has been answered but nesting dataTables remains. Trying non-IceFaces DataTables yields the same result so I'm going to open a new post without the clutter of IceFaces.
-
3. Re: Null Value in s:link w/IceFaces
pnorman4 Feb 20, 2007 9:44 AM (in response to gzoller)I have the same problem. I've been trying several different repeater and datatable components from both Tomahawk, Trinidad and Facelets with the same result. The standard h:commandLink works fine, but an identical s:link always send null as parameter value.
Whats wrong?
I m using Seam 1.1.6,
Myfaces 1.1.4,
Facelets 1.1.12,
Ajax4JSF 1.0.6,
Trinidad incubator-m1-SNAPSHOT -
4. Re: Null Value in s:link w/IceFaces
gzoller Feb 20, 2007 11:07 AM (in response to gzoller)pnorman4,
Here's the scoop... for Seam to pass these components correctly in s:link Gavin said they need to be derived from DataModel (JSF class). Using the @DataModel annotation works on the outer table's data but not the inner tables', so you need to try to create them w/new() as DataModel instances. Remember that Seam juiced EL to allow parameter passing to methods, such as in s:link, which JSF doesn't currently support, and it appears from the code that non-DataModel objects are not passed (null is passed instead).
So far I haven't fixed this particular problem, but I did find a work-around. In my <s:link> elements I can include a <f:param> element that passes an id I can use to find the object I wanted to pass in the first place. If your experience is like mine your can render/access everything you need in the xhtml but you just can't pass values to your backing objects in s:link, right?
Won't win awards for sexiness but it works fine. In my project the code generated by seam-gen produced data tables that used this <s:link>/<f:param> partnership.
ps. Here's another really cleaver/ugly hack to get around the parameter-passing limitations: use a "bastard" Map implementation. Standard EL lets you access #{myNamedObj.map[foo]} where foo is your object you want passed. Supposedly the map does a simple retrieval, but your bastard Map can override the get() method and do any blessed thing it wants. The magic is that your actual object got passed in! Of course you're trampling all over the semantics of what the Map class is supposed to do. I didn't say it was a good idea...but it works just fine.
Greg -
5. Re: Null Value in s:link w/IceFaces
pnorman4 Feb 21, 2007 3:31 AM (in response to gzoller)Thanks!
It's good to know why it didn't work. The workaround solved it.
Per