Javascript 复合组件jsf*primefaces

Javascript 复合组件jsf*primefaces,javascript,jsf,primefaces,composite-component,Javascript,Jsf,Primefaces,Composite Component,在动态生成widgetVar名称时,我无法使用它。我们如何恰当地调用这样的小部件?组件代码: <cc:attribute name="id" required="true" type="java.lang.String" /> ... <cc:implementation> <p:selectOneRadio widgetVar="widgetVariable#{cc.attrs.id}" id="#{cc.attrs.id}" required="fals

在动态生成widgetVar名称时,我无法使用它。我们如何恰当地调用这样的小部件?组件代码:

<cc:attribute name="id" required="true" type="java.lang.String" />
...
<cc:implementation>
    <p:selectOneRadio widgetVar="widgetVariable#{cc.attrs.id}" id="#{cc.attrs.id}" required="false" immediate="#{cc.attrs.immediate}"
                      value="#{cc.attrs.value}">
        <p:ajax event="click" oncomplete="checkRadio()"/>
        <cc:insertChildren/>
    </p:selectOneRadio>

    <script type="text/javascript">
        /*  <![CDATA[ */

        function checkRadio() {
            var widgetVariable = widgetVariable#{cc.attrs.id}; //HERE PROBLEM
            widgetVariable.dosmth();
        }

        /*    ]]> */
    </script>
</cc:implementation>  

但是每个状态应该只针对一个复合状态,每个复合状态使用这个变量,一些想法?

实际上有两个问题

第一个问题是在XHTML文件中声明JS函数,而不是在实际的JS文件中。如果您有多个这些组件,那么基本上就是为HTML输出生成多个JS函数
checkRadio()
。在浏览器中拖动页面,右键单击并查看源代码。你基本上会看到

<script type="text/javascript">
    function checkRadio() {
        // ...
    }
</script>
<script type="text/javascript">
    function checkRadio() {
        // ...
    }
</script>
<script type="text/javascript">
    function checkRadio() {
        // ...
    }
</script>
...
回到您的具体问题,您的第二个问题,您可以使用
window[variableName]
符号通过动态组合的变量名获得全局(窗口)变量。因此,
myComposite.js
中的
checkRadio()
函数(可以随意命名,但与
myComposite.xhtml
的文件名相同)应该如下所示:

function checkRadio(compositeId) {
   var widgetVariableName = "widgetVariable" + compositeId;
   var widgetVariable = window[widgetVariableName];
   widgetVariable.dosmth();
}

id
看起来怎么样?它包含哪些字符?任何,一些字母/数字“MyComponent”“something2”等。所以没有特殊字符,只有字母数字字符?是的,我正在测试atm Balus soltuions,brb。我应该把这个js文件放在哪里?我添加了libary标记,并将其放置在复合组件所在的位置,但当我要使用此复合组件进行页面时,它在页面源代码中显示了一些erorr:。。。与所有其他JSF资源位于同一位置。在
/resources
文件夹中。如果希望它与compositexhtml位于同一文件夹中,只需根据实际的
/resources
-相对路径相应地修改
。顺便说一下,“js”绝对是一个糟糕的库名称。还可以将其作为另一个函数参数传递吗?每个复合组件可以有许多状态,我需要记住这些状态。例如,我得到了1th state=3 2nd state=2 3rd state=0 atm,这个var状态是全局的,所有人都使用它。所以传递它不是一个解决方案,而这个变量可以有一个状态。我不知道传递它作为另一个函数参数是如何形成问题的。
<cc:implementation>
    <h:outputScript name="myComposite.js" />
    ...
    <p:ajax event="click" oncomplete="checkRadio('#{cc.attrs.id}')" />
</cc:implementation>
function checkRadio(compositeId) {
   var widgetVariableName = "widgetVariable" + compositeId;
   var widgetVariable = window[widgetVariableName];
   widgetVariable.dosmth();
}