0

複合コンポーネント内で ajax を使用すると、ajax 機能が動作しません。コードの何が問題になっていますか?

複合コンポーネント:

<composite:interface>
    <composite:attribute name="filter" required="true" type="java.lang.String" />
    <composite:attribute name="list" required="true" type="java.util.List" />
</composite:interface>
<composite:implementation>
    <h:inputText value="#{cc.attrs.filter}">
        <f:ajax event="keyup" render="#{cc.clientId}:table#{cc.clientId}" />
    </h:inputText>
    <h:dataTable id="table#{cc.clientId}" value="#{cc.attrs.list}" var="elem">
        <h:column>
            <h:outputText value="#{elem}" />
        </h:column>
    </h:dataTable>
</composite:implementation>

今は豆

@ManagedBean
@SessionScoped
public class Ajaxcc
{
    private String filter;
    private List<String> list;

    public Ajaxcc()
    {
        list = new ArrayList<String>();
        list.add("one");
        list.add("two");
        list.add("three");
        list.add("four");
    }

    public List<String> getList()
    {
        List<String> filteredList = new ArrayList<String>();
        for (String s : list)
        {
            if (filter == null || filter.trim().equals(""))
            {
                filteredList.add(s);
            }
            else if (s.contains(filter))
            {
                filteredList.add(s);
            }
        }
        return filteredList;
    }

    public String getFilter()
    {
        return filter;
    }

    public void setFilter(String filter)
    {
        this.filter = filter;
    }
}

今ビュー:

<h:form>
    <myCustomComponent:ajaxcc list="#{ajaxcc.list}" filter="#{ajaxcc.filter}" />
</h:form>

私はmyfaces 2.1.10を使用しており、mavenによってTomcat 7.0.39にデプロイしています。

予想される動作: Web サイトのリストは、o - ボタンを押すたびに 1 つ、2 つ、4 つに減らされるはずです。

失敗: リストは縮小されません。

解決策は何ですか?

ところで、複合コンポーネントのコンテンツをビューに入れると、正しく機能します。

<h:form>
  <h:inputText value="#{ajaxcc.filter}">
    <f:ajax event="keyup" render="table" />
  </h:inputText>
  <h:dataTable id="table" value="#{ajaxcc.list}" var="elem">
    <h:column>
      <h:outputText value="#{elem}" />
    </h:column>
  </h:dataTable>
</h:form>

この場合、o を押すと、リストが予想される値に縮小されます。さらに、複合コンポーネントの ajax 呼び出しの応答が、データ テーブルのフィールド値に対して「空」のように見えることがわかりました。直接 ajax 呼び出しの応答には、新しいリストが含まれています。

4

1 に答える 1

1
<h:inputText ...>
    <f:ajax ...render="#{cc.clientId}:table#{cc.clientId}" />
</h:inputText>
<h:dataTable id="table#{cc.clientId}" ...>

これは不必要に不器用です。両方のコンポーネントが同じネーミング コンテナー (コンポジット自体) にあるため、プレフィックスは暗黙的にコンポジット自体によって既に設定されています。サフィックスは有効ですが、不要です。複合コンポーネントの独自の ID は、その親ネーミング コンテナ コンポーネントのコンテキストで一意性をすでに強制しています。ブラウザーでページを開き、ソースを右クリックして表示し、生成された HTML 出力の ID を観察すると、それについての洞察がすでに得られているはずです。

シンプルにしてください:

<h:inputText ...>
    <f:ajax ...render="table" />
</h:inputText>
<h:dataTable id="table" ...>

以下も参照してください。

于 2013-04-26T15:11:46.540 に答える