gpt4 book ai didi

ajax - 重新加载

on a form update

转载 作者:行者123 更新时间:2023-12-04 22:55:11 24 4
gpt4 key购买 nike

随意的想法:我讨厌他们编码到 dataScroller 中的这种“独狼”行为....


我正在尝试根据用户对 <p:selectOneMenu> 的选择实现过滤器这将重新加载 <p:dataScroller> 中显示的内容来自基于选择的 ManagedBean。

MB ( EnglishNumberToWords ) ( random strings )

import java.util.*;
import se.answers.EnglishNumberToWords;
import java.security.SecureRandom;

@ManagedBean
@ViewScoped
public class bean {
private List<String> itens;
private Integer choice = 1; //initialize;
private LazyDataModel<String> model;
// getter setter

@PostConstruct
public void postConstruct() {
int count = loadStringsFromElsewhere();
model = new LazyModelImplmentation(this);
model.setRowCount(count);
}

public Map<String, Integer> mapChoices() {
Map<String, Integer> map = new LinkedHashMap<String, Integer>();
for(int ii=0;ii<5;ii++) {
map.put(ii, convertLessThanOneThousand(ii));
}
}

public List<String> getChunk(int first, int pageSize) {
SecureRandom random = new SecureRandom();
int listSize = itens.size();
int added = 0;
int end = int+pageSize;
while(end > itens.size(){
added++; //the real code here is different, I will just randomize.
int criteria = (random.nextInt(5) + 1);
if(criteria == choice) { // filters out Strings.
String ss = criteria + BigInteger(130, random).toString(32)
itens.add(ss);
}
}
return itens.subList(Math.min(first, itens.size()), Math.min(end, itens.size()));
}

/**
* Get the dataScroller itens from elsewhere, NOT a database.<p>
* here we will use only randons.
*/
private int loadStringsFromElsewhere() {
SecureRandom random = new SecureRandom();
if(itens == null) {
itens = new ArrayList<String>();
}
for(int ii=0;ii< (random.nextInt(50) + 100); ii++) {
int criteria = (random.nextInt(5) + 1);
String ss = criteria + BigInteger(130, random).toString(32);
itens.add(ss);
}
}
}

惰性模型实现

import java.util.List;
import java.util.Map;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

public class LazyModelImplmentation extends LazyDataModel<String> {
private static final long serialVersionUID = 1L;
private Bean bean;

public LazyModelImplmentation(Bean bean) {
this.bean = bean;
}

@Override
public List<String> load(int first, int pageSize, String sortField,
SortOrder sortOrder, Map<String, Object> filters) {
return bean.getChunk(first, pageSize);
}
}

JSF

<h:form prependId="false">
<p:selectOneMenu value="#{bean.choice}">
<f:selectItems value="#{bean.mapChoices()}" />
<p:ajax process="@form" update="@form" />
</p:selectOneMenu>
<p:dataScroller id="da_scroller" var="item"
value="#{bean.model}" rowIndexVar="index" chunkSize="10" lazy="true">

<!-- SHOW THE DATA IN THE item -->
<h:outputText value="#{index}: #{item.toString()}" />
<hr />

</p:dataScroller>
</h:form>

但是 dataScroller 只是忽略了表单更新并继续显示相同的数据。仅更新通过惰性模型加载的新数据,并与旧数据混合。

我如何在表单更新时清理 dataScroller,以便它只显示新数据(如果它返回到第一个 block ,则加分)。

在 Tomcat 7 和 jsf2.2 上使用 Primefaces 5.0(但 jsf 在标记上)。

最佳答案

在摆弄了 <p:dataScroller> 的源代码之后我想不出解决办法。没有记录的方法来更改已经附加的内容,组件只是附加更多内容。

所以我不得不破解我自己的解决方案:

  1. 说谎 <p:dataScroller> :

    • 如果您不这样做,该组件将无法正常工作setRowCount()在惰性模型上。它只获取两个 block 然后停止。
    • 动态更改 rowCount 也没有达到预期的效果。该组件保留其自己的内部计数。 [ 3 ]
    • 同样从 Primefaces 5.0 开始,将 rowCount 设置为 Integer.MAX_VALUE导致 dataScroller 在获取第二个 block 时停止(客户端)。我怀疑一些画家 Shlemiel [ 1 ] [ 2 ] 某处。
    • 因此,在 LazyDataModel 的初始化中,将 rowCount 设置得足够大(但不要太大)。我将其设置为 100,000。
  2. 作弊:我可以控制 dataScroller 的内容,因为我在 @ManagedBean 上构建 block ,所以如果我想重置列表并从头开始服务,我可以。我将留下 getChunk() 的确切实现方法(参见上面问题的 list ) 给读者,但只保留您自己的计数,而不是依赖 LazyDataModel<T>.load() 的参数.

  3. 窃取:清除 <p:selectOneMenu> 的 AJAX 调用中已加载的条目(绑定(bind)到 onstart,因为您不能确定在 dataScroller 更新自身之前有一个窗口可以执行此操作:
<p:selectOneMenu value="#{bean.choice}">
<f:selectItems value="#{bean.mapChoices()}" />
<p:ajax process="@form" update="@form" onstart="cleanScroller()" />
</p:selectOneMenu>
function cleanScroller() {
$('li.ui-datascroller-item').remove();
}

关于ajax - 重新加载 <p :dataScroller> on a form update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31210812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com