动态地将一个或多个outputText添加到现有页面

时间:2016-06-01 19:03:41

标签: java primefaces

我需要使用managedbeans生成的新数据不断更新页面。 Managedbean每隔几分钟创建一个新的值列表,UI必须为managedbean新创建的List中的每个值创建一个OutputText。 Catch是,UI应该保留outputTexts并为每个请求添加新的一个,它不应该刷新/删除旧的outputTexts。

我的代码如下所示 - 为每个ajax调用更新相同的outputText字段,我需要像上面提到的那样进行更改。

<c:forEach var="data" items="#{myBean.dataList}">
    <p:fieldset legend="#{data}" toggleable="true" toggleSpeed="500">
        <h:panelGrid columns="2" cellpadding="5" border="0">
            <p:scrollPanel style="height:300px">
               <p:poll interval="2" listener="#{myBean.getDataList}" update="field1 field2"/>
                   <h:outputText value="#{data.field1}" id="field1"/>
                   <h:outputText value="#{data.field2}" id="field2"/>
            </p:scrollPanel>
        </h:panelGrid>
    </p:fieldset>
 </c:forEach>

因此,对于每个ajax调用,由managedbeans生成的数据项可能很少,并且对于每个项都应该有一个新的outputText字段。

2 个答案:

答案 0 :(得分:0)

您可以使用<h:outputText value="#{data.field1}" id="field1"/>

的datalist

制作一个列表并将它们用作输出文本,是的,你需要一些css格式,因为datalist使用了默认的css。示例代码

<p:poll interval="3" listener="#{yourbean.yourmethod}" update="<updatecomponet>" />
<p:dataList value="#{yourbean.tempList}" var="s" id="updatecomponet">
        <p:outputLabel value="#{s}"></p:outputLabel>
</p:dataList>

注意:轮询调用侦听器时,需要在列表中添加值。它正在我的项目中工作,让我知道其他任何事情。希望这会有所帮助。

答案 1 :(得分:0)

也许不是完美的解决方案,但您可以使用延迟加载的DataTable,poll组件可以更新数据表页面,而您不需要更新大量组件。

编辑: 的 XHTML

 <p:dataTable var="v" 
     value="#{myBean.getLazyList}" 
     scrollRows="1" 
     liveScroll="true" 
     rows="20" 
     scrollHeight="300" 
     lazy="true" 
     scrollable="true" 
     id="tsUpdates">
            <p:column>
                   <h:outputText value="#{v.fields1}" />
            </p:column>
</p:dataTable>

<强>豆

public class Bean {
    private LazyDataModel<MyClass> lazyList;

    @Named("myBean")
    @ViewScoped

    @PostConstruct
        public void init() {
           lazyList = new LazyMyClassModel();  //where myList is your data source
        }

    //getters and setters    
}

<强> LazyModel

    public class LazyMyClassModel extends LazyDataModel<MyClass>{
    private Integer findAllCount;

    public LazyMyClassModel(){

    }

    @Override
    public List<MyClass> load(int first, int pageSize, String sortField, SortOrder sortOrder,Map<String, String> filters){
        List<MyClass> myList = //your live source of data
        List<MyClass> data = new ArrayList<MyClass>();
        data = getSubList(MyList, first, pageSize)

        if (findAllCount == null) {
           findAllCount = myList.size
           this.setRowCount(findAllCount);
       }
       return data
    }

    public List<MyClass> getSubList(List<MyClass> list, int fromIndex, int toIndex) {
        int size = list.size();
        if (fromIndex >= size || toIndex <= 0 || fromIndex >= toIndex) {
            return Collections.emptyList();
        }
        fromIndex = Math.max(0, fromIndex);
        toIndex = Math.min(size, toIndex);
        return list.subList(fromIndex, toIndex);
    }
}