2017-11-14 15 views
-1

アイテムにリピートレンダーselectBooleanCheckboxがロードされた後に、リストを更新するremmoteCommandがあります。ただし、チェックボックスで値が正しく設定されていない場合は、選択されたプロパティ(ブール値)を持つ項目がtrueに設定されている項目があります。selectBooleanCheckboxがremoteCommandの後に設定されていません

リストがロードされた後にバッキングBeanにアイテムを設定しただけでは、そのアイテムに対してのみ機能します。何が問題なの?

いるindex.xhtml

<h:form> 
     <h:panelGroup id="itemsHolder"> 
      <h:panelGrid rendered="#{backingBean.items != null}"> 
       <h:selectBooleanCheckbox value="#{backingBean.item.selected}" disabled="#{backingBean.rendered}" /> #{backingBean.item.name} 
       <ui:repeat value="#{backingBean.items.toArray()}" var="option" > 
        <h:selectBooleanCheckbox value="#{option.selected}" disabled="#{backingBean.rendered}" /> 
        #{option.name} 
        <br /> 
       </ui:repeat> 
      </h:panelGrid> 
     </h:panelGroup> 
     <p:remoteCommand rendered="#{backingBean.rendered}" 
         name="initItems" 
         actionListener="#{backingBean.initItems()}" 
         process="@this" 
         update="itemsHolder"/> 

    </h:form> 

    <ui:fragment rendered="#{backingBean.rendered}"> 
     <script> 
      $(document).ready(function() { 
       setTimeout(function() { 
        initItems(); 
       }, 3000); 

      }); 
     </script> 
    </ui:fragment> 

BackingBean.java

@Component 
@ManagedBean 
@Scope("view") 
public class BackingBean { 

private boolean rendered = true; 

private Set<Item> items; 

private Item item; 

public void initItems() { 
    items = new LinkedHashSet<>(); 
    items.add(new Item("item 1", true, "1")); 
    items.add(new Item("item 2", false, "2")); 
    items.add(new Item("item 3", true, "3")); 

    item = new Item("lonely item", true, "4"); 
    } 

//Getters and setters 
} 

UPDATE:私はサンドボックス内の実際のコードのコピーを作成し 、私はまだ再現することはできませんよ、I私は実際のコードからより多くの依存関係を加えなければならないと思う。

+0

リモートコマンドはどこにありますか?あなたの[mcve]はどこにありますか? – Kukeltje

+0

最小限の検証可能な例を作成するために、コードを別のプロジェクトに追加しましたが、再現できませんでした。問題は、プロジェクトには非常に多くの依存関係とフレームワークがあり、しばらく時間がかかることです。今までの問題は私のローカル環境でのみ起こっています。私はあなたの時間のおかげで、仕事を終えたときに戻ってきます。 – Edu

答えて

0

私はあなたのケースを再現したのだがとうまく働いている次のような単純な管理対象Bean

@ManagedBean(name = "bean") 
@ViewScoped 
public class YourBean implements Serializable { 
    List<YourItem> items=new ArrayList<>(); 
    YourItem anItem=new YourItem(); 

    @PostConstruct 
    public void init() { 
     System.out.println("Bean is created"); 
     //initialize items 
     anItem.setSelected(false); 
     //add 5 items to list 
     for (int i=0;i<5;i++){ 
      YourItem item=new YourItem(); 
      item.setSelected(false); 
      items.add(item); 
     } 
    } 

    public void onUpdateItems(){ 
     System.out.println("Items will be updated..."); 
     anItem.setSelected(true); 
     //modify 1st and 3rd item 
     items.get(0).setSelected(true); 
     items.get(2).setSelected(true); 
     //remove 4th item 
     items.remove(3); 
    } 

    public List<YourItem> getItems() { 
     return items; 
    } 

    public void setItems(List<YourItem> items) { 
     this.items = items; 
    } 

    public YourItem getAnItem() { 
     return anItem; 
    } 

    public void setAnItem(YourItem anItem) { 
     this.anItem = anItem; 
    } 
} 

p:commandは、この例でコードを比較方法

  <h:form id="form"> 
      <h:panelGroup id="itemHolder"> 
       <h:panelGrid rendered="#{bean.items != null}"> 
        <h:selectBooleanCheckbox value="#{bean.anItem.selected}" /> 
        <ui:repeat value="#{bean.items}" var="item"> 
         <h:selectBooleanCheckbox value="#{item.selected}" /> 
         #{item.selected} 
         <br /> 
        </ui:repeat> 
       </h:panelGrid> 
      </h:panelGroup> 

      <p:remoteCommand name="startUpdate" 
          actionListener="#{bean.onUpdateItems()}" 
          update=":form:itemHolder"/> 
      <p:commandButton value="Update items" onclick="startUpdate();"/> 
     </h:form> 

を次のように実装する必要があります。あなたのマネージドBeanメソッドには、itemsリストの更新方法や更新方法に問題があります。h:panelGroup

+0

こんにちは、Dusan、私は別のプロジェクトでそれを複製しようとしましたが、あなたが疑ったように実際に動作します。私は、私がそれを再現できるようになるまで、メインプロジェクトの依存関係を追加し続けなければならないと思う。 – Edu

関連する問題