7

これがJSF/ELの問題なのか、それとも何か問題があるのか​​ を調べようとしています。

基本的に、アイテム オブジェクトを ui:param として ui:composition に渡し、内部にボタンを配置し (つまり、ブートストラップ ボタンなので、実際には html リンクであるため、commandLink を使用します)、アイテムを使用してアクションを実行させたいと考えていました。パラメータ。これは、いくつかのパラメーターが渡された ui:composition item.xhtml です。

<ui:include src="comp/item.xhtml">
    <ui:param name="item" value="#{itemVM.item}"/>
    <ui:param name="desc" value="#{true}"/>
</ui:include>

このボタンを複合コンポーネント「bt:button」にしたいのですが、「item」パラメーターの解決に問題があるようです。これを確認するために、コンポーネントからコマンドリンクを取り出してページに配置し、十分に機能することを確認しました。さらに、bt:button を ui:composition の外に移動すると、そこでも機能します。最後に、'test' のような一重引用符を使用して item を文字列に変更すると、それも機能します (テスト目的で、アクション メソッドはオブジェクトを受け取ります)。これらの 3 つのケースに基づくと、複合コンポーネントが複合コンポーネントに渡される項目パラメーターの解決に問題を抱えているように見えます。

item.xhtml 内の最初のテスト (つまり、複合コンポーネントと通常の JSF コマンドリンク) の例を次に示します。

<!- This composite component doesn't Work -->
<bt:button id="cmpBtn" active="#{user.compares[item.id]}"
           disabled="#{user.compares[item.id] != null and itemsCtr.numOfCompares >= 100}"
           styleClass="btn-item-compare btn-small"
           style="margin-bottom:5px"
           action="#{itemsCtr.compare(item)}">
    <i class="#{user.compares[item.id] != null ? 'icon-minus' : 'icon-plus'}"/>
    <h:outputText value="#{user.compares[item.id] != null ? 'Comparing' : 'Compare'}"/>
    <f:ajax render="@this"/>
</bt:button>

<!-- This regular jsf component works -->
<h:commandLink action="#{itemsCtr.compare(item)}" value="Test">
    <f:ajax render="@this"/>
</h:commandLink>

そして、ここに bt:button の私の複合コンポーネント定義があります:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:f="http://java.sun.com/jsf/core">

<cc:interface componentType="LinkComponent">
    <cc:attribute name="action" targets="button"/>
    <cc:attribute name="value" type="java.lang.String"/>
    <cc:attribute name="active" type="java.lang.Boolean"/>
    <cc:attribute name="title" type="java.lang.String"/>
    <cc:attribute name="styleClass" type="java.lang.String"/>
    <cc:attribute name="disabled" type="java.lang.Boolean"/>
    <cc:attribute name="style" type="java.lang.String"/>
</cc:interface>

<cc:implementation>
    <h:commandLink id="button" binding="#{cc.link}"
                   styleClass="btn #{cc.attrs.active ? 'active' : ''} #{cc.attrs.disabled ? 'disabled' : ''} #{cc.attrs.styleClass}"
                   title="#{cc.attrs.title}" style="#{cc.attrs.style}" disabled="#{cc.attrs.disabled}" value="#{cc.attrs.value}">
        <cc:insertChildren/>
    </h:commandLink>
</cc:implementation>
</html>

私の質問は、これは JSF の問題ですか、それとも何か問題がありますか? おそらく複合コンポーネントの定義でしょうか?

4

3 に答える 3

0

よくわかりませんが、交換してみてください

#{user.compares[item.id]}

#{user.compares[item]['id']}
于 2014-01-14T12:07:54.877 に答える
0

私はあなたと同じニーズを持っていて、あなたと同じようにビューパラメーターを持つ子を属性として挿入する複合コンポーネントを作成しましたが、値は常に null だったので、JSF の問題だと思います。

于 2012-09-18T11:37:52.753 に答える
0

交換してみてください

disabled="#{user.compares[item.id] != null and itemsCtr.numOfCompares >= 100}"

disabled="#{user.compares[item.id] != null and itemsCtr.numOfCompares ge 100}"
于 2014-01-02T15:52:02.887 に答える