ICEfaces数据表中的多个selectInputText小部件表现不正常

时间:2010-07-09 15:49:42

标签: datatable icefaces

我在数据表中有多个selectInputText控件,如下所示:

<ice:dataTable id="attributesList" value="#{myForm.myAttributes}" var="entry" cellpadding="0" rows="9999" columnClasses="myColumn,myColumn">
  <ice:column>
    <!-- auto-complete -->
    <ice:panelGroup>
      <ice:selectInputText rows="15" width="120" maxlength="255" value="#{entry.attribute.stringValue}" valueChangeListener="#{myFieldAutocomplete.updateList}" immediate="true">
        <f:selectItems value="#{myFieldAutocomplete.list}" />
        <f:attribute name="fieldName" value="#{entry.name}" />
      </ice:selectInputText>
    </ice:panelGroup>
  </ice:column>
</ice:dataTable>

我的支持bean代码是:

public class myFieldAutocomplete {

   // default value, empty string
   private String currentFieldValue = "";

   // list of possible matches.
   private List<SelectItem> matchesSIList = new ArrayList<SelectItem>();

   public void updateList(ValueChangeEvent event) {
      currentFieldValue = "";
      // get a new list of matches.
      setMatches(event);

      if (event.getComponent() instanceof SelectInputText) {
         SelectInputText autoComplete = (SelectInputText) event.getComponent();
         if (autoComplete.getSelectedItem() != null) {
            currentFieldValue = (String) autoComplete.getSelectedItem().getValue();
         }
         else {
            String tempValue = getMatch(autoComplete.getValue().toString());
            if(tempValue != null) {
               currentFieldValue = tempValue;
            }
         }
      }
   }

   public String getCurrentFieldValue() {
      return currentFieldValue;
   }

   public List<SelectItem> getList() {
       return matchesSIList;
   }

   private String getMatch(String value) {
      String result = null;
      if (matchesSIList != null) {
          String str;
          Iterator<SelectItem> itr = matchesSIList.iterator();
          while (itr.hasNext()) {
              SelectItem si = (SelectItem) itr.next();
              str = (String) si.getValue();
              if (str.startsWith(value)) {
                  result = str;
                  break;
              }
          }
      }
      return result;
   }

   public void setMatches(ValueChangeEvent event) {
      List<String> newMatchesStrList = new ArrayList<String>();
      if (event.getComponent() instanceof SelectInputText) {
         SelectInputText autoComplete = (SelectInputText) event.getComponent();
         myClassDAO myDao = (myClassDAO) Context.getInstance().getBean(myClassDAO.class);
         String fieldName = (String) autoComplete.getAttributes().get("fieldName");
         newMatchesStrList = myDao.findTemplateFieldValues((String)autoComplete.getValue(), fieldName);
      }
      // assign new matchList
      if (this.matchesSIList != null) {
          this.matchesSIList.clear();
      }
      Iterator<String> itr = newMatchesStrList.iterator();
      while(itr.hasNext()) {
         String str = (String) itr.next();
         matchesSIList.add(new SelectItem(str, str));
      }
   }
}

bean在请求范围内(尽管我也尝试过会话范围)。我正在使用ICEfaces社区版1.8.2。

问题是,这些自动完成控件是根据数据表中每个条目的某些属性动态创建的。因此,您可以在同一个panelGroup中拥有2个或更多此类自动完成控件。在这种情况下,当您开始键入第一个控件时,它似乎触发所有兄弟自动完成控件的事件,最后按顺序返回最后一个列表。 一般来说,我注意到由于事件一次触发所有自动完成控件而导致的不稳定行为,并且值/列表变得混乱。

我做错了什么?

提前致谢!

0 个答案:

没有答案