2009/5/11 Ryan Lubke <Ryan.Lubke@sun.com>
On 5/11/09 7:40 AM, David Geary wrote:
I have a login composite component that looks like this:

<composite:interface>...</composite:interface>
..
<composite:implementation>
<script type="text/javascript">
               function checkForm(form) {
                 var name = form['#{cc.clientId}:name'].value;
                 var pwd = form['#{cc.clientId}:password'].value;

                 if (name == "" || pwd == "") {
                   alert("Please enter name and password.");
                   return false;
                 }
                 return true;
               }
</script>
 ...
</composite:implementation>

I have components with "name" and "password" component ids in a form in the ... part of the implementation. That works fine.

However, if I pull the JS out into its own file, and do this:

<composite:interface>...</composite:interface>
..
<composite:implementation>
<h:outputScript library="components/login" name="login.js"/>
 ...
</composite:implementation>

h:outputScript puts the JS in the page, but the JS no longer works because the expression cc.clientId evaluates to an empty string.

That's a bug, is it not?
No, I don't believe it is.  The javascript file will be served in a separate request.  There is no way to determine the
component at that time.

That's what I figured, but that's not going to be obvious to the average developer. This is a pretty serious violation of the principle of least astonishment, and JSF has enough of those violations, IMO.

If there's no way to make it work, it should be documented, preferably in the pdl (or is it vdl now?) docs that h:outputScript will not work when the corresponding JS references a composite component.


david


I haven't tried it, but I wonder if the flash could be used here?


david