Apache wicket 6.29x,带 ListView 和 AjaxFormChoiceComponentUpdatingBehavior () 的 RadioGroup
Apache wicket 6.29x, RadioGroup with ListView with AjaxFormChoiceComponentUpdatingBehavior ()
我有一个列表,这个列表中的每个项目我都有一个 radioGroup 用于两个选项,具体取决于上传字段的选择,我使用动态 id 非常动态,但是 AjaxFormChoiceComponentUpdatingBehavior 的唯一迭代有效并且listView 的最后一个 radioGroup。
LoadableDetachableModel<List<RegistroPresencaColaborador>> registroPresencasColab = new LoadableDetachableModel<List<RegistroPresencaColaborador>>() {
private static final long serialVersionUID = 1L;
@Override
protected List<RegistroPresencaColaborador> load() {
List<RegistroPresencaColaborador> list = new ArrayList<RegistroPresencaColaborador>();
count=0;
if(listaRegistroPresencas!=null && listaRegistroPresencas.size() > 0 ){
list.addAll(listaRegistroPresencas);
}
return list;
}
};
listViewRegistroColab = new ListView<RegistroPresencaColaborador>("listaRegistroPresencaColab",registroPresencasColab){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<RegistroPresencaColaborador> item) {
final RegistroPresencaColaborador registroPreColaborador = item.getModelObject();
count++;
registroPreColaborador.setCount(count.toString());
if(clicouSelecionarTodos !=null && getClicouSelecionarTodos()){
registroPreColaborador.setFrequencia(RegistroPresencaColaborador.PRESENCA);
}else if(clicouSelecionarTodos !=null && !getClicouSelecionarTodos()){
registroPreColaborador.setFrequencia(RegistroPresencaColaborador.FALTA);
}
item.addOrReplace(new Label("colaborador",registroPreColaborador.getColaborador().getNome()).setOutputMarkupId(true));
---RadioGroup item.addOrReplace(criarCampoFrequencia(registroPreColaborador));
item.addOrReplace(criarDivAnexoColab(registroPreColaborador));
//item.add(criarDivLinkDownload(registroPreColaborador));
}
};
//组件RadioGroup
private RadioGroup<Integer> criarCampoFrequencia(final RegistroPresencaColaborador registroPreColaborador ) {
radioGroupTipo = new RadioGroup<Integer>("frequencia", new PropertyModel<Integer>(registroPreColaborador, "frequencia")){
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled() {
if(getAbstractBean().getId()!=null && getAbstractBean().getVisualizar()){
return false;
}else{
return true;
}
}
};
if(radioGroupSelecionouTodos.getModelObject() != null && !radioGroupSelecionouTodos.getModelObject() || registroPreColaborador.getId() != null && registroPreColaborador.getFrequencia().equals(RegistroPresencaColaborador.FALTA) ){
radioGroupTipo.add(new AttributeModifier("class", "switch-toggle switch-candy switch-candy-red large-4"));
}
radioGroupTipo.setRequired(true);
radioGroupTipo.setOutputMarkupId(true);
radioGroupTipo.setOutputMarkupPlaceholderTag(true);
radioGroupTipo.setRenderBodyOnly(false);
radioGroupTipo.add(new Radio<Integer>("tipoPresenca", new Model<Integer>(RegistroPresencaColaborador.PRESENCA)).add(new AttributeModifier("id", "tipoPresenca"+registroPreColaborador.getCount())).setOutputMarkupId(true));
radioGroupTipo.add(new Radio<Integer>("tipoFalta", new Model<Integer>(RegistroPresencaColaborador.FALTA)).add(new AttributeModifier("id", "tipoFalta"+registroPreColaborador.getCount())).setOutputMarkupId(true));
radioGroupTipo.add(new AjaxFormChoiceComponentUpdatingBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
if(radioGroupTipo.getModelObject() != null && radioGroupTipo.getModelObject().equals(RegistroPresencaColaborador.FALTA)){
radioGroupTipo.add(new AttributeModifier("class", "switch-toggle switch-candy switch-candy-red large-4"));
}else if(radioGroupTipo.getModelObject() != null && radioGroupTipo.getModelObject().equals(RegistroPresencaColaborador.PRESENCA)){
radioGroupTipo.add(new AttributeModifier("class", "switch-toggle switch-candy switch-candy-green large-4"));
}
target.add(radioGroupTipo);
target.add(divAtualizaArquivo);
}
});
radioGroupTipo.add(criarLabelPresenca(registroPreColaborador));
radioGroupTipo.add(criarLabelFalta(registroPreColaborador));
return radioGroupTipo;
}
//每个radioGroup的标签
private Label criarLabelFalta(final RegistroPresencaColaborador registroPreColaborador ){
Label falta = new Label("falta", "Falta");
falta.setOutputMarkupId(true);
falta.setOutputMarkupPlaceholderTag(true);
falta.add(new AttributeModifier("for", "tipoFalta"+registroPreColaborador.getCount()));
return falta;
}
private Label criarLabelPresenca(final RegistroPresencaColaborador registroPreColaborador ){
Label presenca = new Label("presenca", "Presença");
presenca.setOutputMarkupId(true);
presenca.setOutputMarkupPlaceholderTag(true);
presenca.add(new AttributeModifier("for", "tipoPresenca"+registroPreColaborador.getCount()));
return presenca;
}
//我的HTML鳕鱼
<tr wicket:id="listaRegistroPresencaColab">
<td style="text-align: left;"><span wicket:id="colaborador">Colaborador</span></td>
<td style="width: 20%; border: 1px solid #333; border-radius: 3px; text-align: center; vertical-align:middle;">
<div wicket:id="frequencia" class="switch-toggle switch-candy large-6 ">
<input wicket:id="tipoPresenca" type="radio" /><label onclick="" wicket:id="presenca" >Presença</label>
<input wicket:id="tipoFalta" type="radio"/><label onclick="" wicket:id="falta" >Falta</label>
</div>
</td>
<td style="text-align: left;"><div wicket:id="divAtualizaArquivo"> <input wicket:id="arquivoAnexoRegistro" type="file" class="form-control"/> </div></td>
</tr>
//图片
https://uploaddeimagens.com.br/imagens/opera_instantaneo_2019-01-14_114545_localhost-png
有其他人遇到过这个问题吗?或者您知道解决方法吗?
事实上 Ajax 更新仅适用于您的最后一次迭代,这强烈表明您的标记中有重复的 ID。
请注意,您不需要 fiddle 和 setOutputMarkupId()
或 new AttributeModifier("id")
,因为 AjaxFormChoiceComponentUpdatingBehavior
会自动生成必要的标记 ID。
虽然我没有在您的代码中发现任何错误,所以请在浏览器中重新检查您生成的标记。
对于AjaxFormChoiceComponentUpdatingBehavior
,您"frequencia" div 上的标记 ID 至关重要,来自无线电输入的那些无关紧要。
解决方案
在本地声明,如果你需要给目标使用一个 WebMarkupContainer 并定位它。
private RadioGroup<Integer> criarCampoFrequencia( RegistroPresencaColaborador registroPreColaborador ) {
final RadioGroup<Integer> radioGroupTipo = new RadioGroup<Integer>("frequencia", new PropertyModel<Integer>(registroPreColaborador, "frequencia")){
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled() {
if(getAbstractBean().getId()!=null && getAbstractBean().getVisualizar()){
return false;
}else{
return true;
}
}
};
}
我有一个列表,这个列表中的每个项目我都有一个 radioGroup 用于两个选项,具体取决于上传字段的选择,我使用动态 id 非常动态,但是 AjaxFormChoiceComponentUpdatingBehavior 的唯一迭代有效并且listView 的最后一个 radioGroup。
LoadableDetachableModel<List<RegistroPresencaColaborador>> registroPresencasColab = new LoadableDetachableModel<List<RegistroPresencaColaborador>>() {
private static final long serialVersionUID = 1L;
@Override
protected List<RegistroPresencaColaborador> load() {
List<RegistroPresencaColaborador> list = new ArrayList<RegistroPresencaColaborador>();
count=0;
if(listaRegistroPresencas!=null && listaRegistroPresencas.size() > 0 ){
list.addAll(listaRegistroPresencas);
}
return list;
}
};
listViewRegistroColab = new ListView<RegistroPresencaColaborador>("listaRegistroPresencaColab",registroPresencasColab){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<RegistroPresencaColaborador> item) {
final RegistroPresencaColaborador registroPreColaborador = item.getModelObject();
count++;
registroPreColaborador.setCount(count.toString());
if(clicouSelecionarTodos !=null && getClicouSelecionarTodos()){
registroPreColaborador.setFrequencia(RegistroPresencaColaborador.PRESENCA);
}else if(clicouSelecionarTodos !=null && !getClicouSelecionarTodos()){
registroPreColaborador.setFrequencia(RegistroPresencaColaborador.FALTA);
}
item.addOrReplace(new Label("colaborador",registroPreColaborador.getColaborador().getNome()).setOutputMarkupId(true));
---RadioGroup item.addOrReplace(criarCampoFrequencia(registroPreColaborador));
item.addOrReplace(criarDivAnexoColab(registroPreColaborador));
//item.add(criarDivLinkDownload(registroPreColaborador));
}
};
//组件RadioGroup
private RadioGroup<Integer> criarCampoFrequencia(final RegistroPresencaColaborador registroPreColaborador ) {
radioGroupTipo = new RadioGroup<Integer>("frequencia", new PropertyModel<Integer>(registroPreColaborador, "frequencia")){
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled() {
if(getAbstractBean().getId()!=null && getAbstractBean().getVisualizar()){
return false;
}else{
return true;
}
}
};
if(radioGroupSelecionouTodos.getModelObject() != null && !radioGroupSelecionouTodos.getModelObject() || registroPreColaborador.getId() != null && registroPreColaborador.getFrequencia().equals(RegistroPresencaColaborador.FALTA) ){
radioGroupTipo.add(new AttributeModifier("class", "switch-toggle switch-candy switch-candy-red large-4"));
}
radioGroupTipo.setRequired(true);
radioGroupTipo.setOutputMarkupId(true);
radioGroupTipo.setOutputMarkupPlaceholderTag(true);
radioGroupTipo.setRenderBodyOnly(false);
radioGroupTipo.add(new Radio<Integer>("tipoPresenca", new Model<Integer>(RegistroPresencaColaborador.PRESENCA)).add(new AttributeModifier("id", "tipoPresenca"+registroPreColaborador.getCount())).setOutputMarkupId(true));
radioGroupTipo.add(new Radio<Integer>("tipoFalta", new Model<Integer>(RegistroPresencaColaborador.FALTA)).add(new AttributeModifier("id", "tipoFalta"+registroPreColaborador.getCount())).setOutputMarkupId(true));
radioGroupTipo.add(new AjaxFormChoiceComponentUpdatingBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
if(radioGroupTipo.getModelObject() != null && radioGroupTipo.getModelObject().equals(RegistroPresencaColaborador.FALTA)){
radioGroupTipo.add(new AttributeModifier("class", "switch-toggle switch-candy switch-candy-red large-4"));
}else if(radioGroupTipo.getModelObject() != null && radioGroupTipo.getModelObject().equals(RegistroPresencaColaborador.PRESENCA)){
radioGroupTipo.add(new AttributeModifier("class", "switch-toggle switch-candy switch-candy-green large-4"));
}
target.add(radioGroupTipo);
target.add(divAtualizaArquivo);
}
});
radioGroupTipo.add(criarLabelPresenca(registroPreColaborador));
radioGroupTipo.add(criarLabelFalta(registroPreColaborador));
return radioGroupTipo;
}
//每个radioGroup的标签
private Label criarLabelFalta(final RegistroPresencaColaborador registroPreColaborador ){
Label falta = new Label("falta", "Falta");
falta.setOutputMarkupId(true);
falta.setOutputMarkupPlaceholderTag(true);
falta.add(new AttributeModifier("for", "tipoFalta"+registroPreColaborador.getCount()));
return falta;
}
private Label criarLabelPresenca(final RegistroPresencaColaborador registroPreColaborador ){
Label presenca = new Label("presenca", "Presença");
presenca.setOutputMarkupId(true);
presenca.setOutputMarkupPlaceholderTag(true);
presenca.add(new AttributeModifier("for", "tipoPresenca"+registroPreColaborador.getCount()));
return presenca;
}
//我的HTML鳕鱼
<tr wicket:id="listaRegistroPresencaColab">
<td style="text-align: left;"><span wicket:id="colaborador">Colaborador</span></td>
<td style="width: 20%; border: 1px solid #333; border-radius: 3px; text-align: center; vertical-align:middle;">
<div wicket:id="frequencia" class="switch-toggle switch-candy large-6 ">
<input wicket:id="tipoPresenca" type="radio" /><label onclick="" wicket:id="presenca" >Presença</label>
<input wicket:id="tipoFalta" type="radio"/><label onclick="" wicket:id="falta" >Falta</label>
</div>
</td>
<td style="text-align: left;"><div wicket:id="divAtualizaArquivo"> <input wicket:id="arquivoAnexoRegistro" type="file" class="form-control"/> </div></td>
</tr>
//图片 https://uploaddeimagens.com.br/imagens/opera_instantaneo_2019-01-14_114545_localhost-png
有其他人遇到过这个问题吗?或者您知道解决方法吗?
事实上 Ajax 更新仅适用于您的最后一次迭代,这强烈表明您的标记中有重复的 ID。
请注意,您不需要 fiddle 和 setOutputMarkupId()
或 new AttributeModifier("id")
,因为 AjaxFormChoiceComponentUpdatingBehavior
会自动生成必要的标记 ID。
虽然我没有在您的代码中发现任何错误,所以请在浏览器中重新检查您生成的标记。
对于AjaxFormChoiceComponentUpdatingBehavior
,您"frequencia" div 上的标记 ID 至关重要,来自无线电输入的那些无关紧要。
解决方案
在本地声明,如果你需要给目标使用一个 WebMarkupContainer 并定位它。
private RadioGroup<Integer> criarCampoFrequencia( RegistroPresencaColaborador registroPreColaborador ) {
final RadioGroup<Integer> radioGroupTipo = new RadioGroup<Integer>("frequencia", new PropertyModel<Integer>(registroPreColaborador, "frequencia")){
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled() {
if(getAbstractBean().getId()!=null && getAbstractBean().getVisualizar()){
return false;
}else{
return true;
}
}
};
}