2

selectOneMenuここでのショーケースの例とまったく同じように、Primefaces 5.2 を使用して、1 つの結果がselectOneMenuAjax を介して 2 番目に更新されるモバイル フォームを作成したい: http://www.primefaces.org/showcase/ui/ajax/dropdown.xhtmlしかし、モバイル バージョン.

私の質問はこれと非常によく似ています: Primefaces Mobile の Ajax は <p:selectOneMenu> を更新しませんが、答えはありません。

ショーケースの例とまったく同じようにJSF ページと backingbean を作成しましたが、動作します。

<f:view renderKitId="PRIMEFACES_MOBILE" />ただし、更新後に2番目を使用してモバイルの側面を追加するselectOneMenuと、プレーンにレンダリングされ、永続的なスピナーが表示されます。

...
<f:view renderKitId="PRIMEFACES_MOBILE" />
...
<h:body>
<h:form>
    <p:growl id="msgs" showDetail="true" />

    <p:panel header="Select a Location" style="margin-bottom:10px;">
        <h:panelGrid columns="2" cellpadding="5">
            <p:outputLabel for="country" value="Country: " />
            <p:selectOneMenu id="country" value="#{dropdownView.country}" style="width:150px">
                <p:ajax listener="#{dropdownView.onCountryChange}" update="city" />
                <f:selectItem itemLabel="Select Country" itemValue="" noSelectionOption="true" />
                <f:selectItems value="#{dropdownView.countries}" />
            </p:selectOneMenu>

            <p:outputLabel for="city" value="City: " />
            <p:selectOneMenu id="city" value="#{dropdownView.city}" style="width:150px">
                <f:selectItem itemLabel="Select City" itemValue="" noSelectionOption="true" />
                <f:selectItems value="#{dropdownView.cities}" />
            </p:selectOneMenu>

            <p:outputLabel for="debug" value="Debug: " />
            <p:inputText id="debug" value="#{dropdownView.debug}"/>
        </h:panelGrid>
...

debug私の更新ターゲットinputTextが更新されている場合、Ajax呼び出しは機能しますが、更新ターゲットがそうでない場合は機能cityselectOneMenuます。

これはバグですか?モバイルの側面を誤用していませんか? これに関するドキュメントは不足しているようです。

編集

inputTextソースに含まれていませんでした。修正しました。

4

1 に答える 1

3

これは、PrimeFaces モバイルに関連する JavaScript のバグです。モバイル レンダラーが追加の JS を挿入して、後でドロップダウンの HTML 表現を DOM の別の場所に再配置することを考慮していませんでした (生の HTML 出力 (ブラウザーの「ソースを表示」) と実際の HTML DOM ツリー (ブラウザの「Inspect Element」)。

Chrome のコンソールに表示される正確な JavaScript エラーは次のとおりです。

Uncaught NotFoundError: 「ノード」で「replaceChild」を実行できませんでした: 置き換えられるノードは、このノードの子ではありません。

(ブラウザのコンソールを常にチェックして手がかりを見つけるための学習のヒントとして受け取っていただければ幸いです)

あなたの最善の策は、これをバグとして PrimeFaces の人に報告することです。

当面の回避策は、別の (プレーンな) 要素でラップし、代わりに更新することです。

<p:selectOneMenu ...>
    ...
    <p:ajax ... update="cityWrapper" />
</p:selectOneMenu>

<h:panelGroup id="cityWrapper">
    <p:selectOneMenu id="city" ...>
        ...
    </p:selectOneMenu>
</h:panelGroup>

具体的な問題とは無関係です。これは、コンポーネントnoSelectionOption="true"に追加した場合にのみ効果があります。hideNoSelectionOption="true"ao も参照してください。「何も選択されていない」オプションを JSF の selectOneMenu に追加する最良の方法。それ以外の場合は、そのままにしておきます。

于 2015-08-17T15:40:26.480 に答える