AjaxEditableLabel的Wicket- RequiredFieldValidator

起初我想说,虽然在.NET中使用了RequiredFieldValidator,但我将这个术语用于wicket,因为我想要一个标签(颜色:红色和文本:*),当AjaxEditableLabel的编辑器时,它将显示在AjaxEditableLabel旁边将是空白的。 我已经设置了AjaxEditableLabel.setRequired(true)并且它正在工作,即表单无法提交。 但是我无法在AjaxEditableLabel旁边跟踪那个红星标签。 到目前为止我做的是:

private class TaskTypeSettingsForm extends Form { private static final long serialVersionUID = 10058L; private FeedbackMessageFilter filter; public TaskTypeSettingsForm(String id) { super(id); FeedbackPanel feedback = new FeedbackPanel("feedback"); filter = new FeedbackMessageFilter(); feedback.setFilter(filter); add(feedback); setOutputMarkupId(true); final TaskTypeSettingsFormModel taskTypeSettingsFormModel = new TaskTypeSettingsFormModel(); IModel model = new BoundCompoundPropertyModel(taskTypeSettingsFormModel); setModel(model); final WebMarkupContainer div = new WebMarkupContainer("div"); div.setOutputMarkupId(true); final ListView listView = new ListView("listView", new PropertyModel(taskTypeSettingsFormModel, "taskTypeList")) { @Override protected void populateItem(ListItem item) { final String value = (String) item.getModelObject(); final int index = item.getIndex(); final Label star = new Label("star", "*"); //this label is always displaying, I need to //display it when the editor is blank and hide when //it contain valid text star.setOutputMarkupId(true); final AjaxEditableLabel label = new AjaxEditableLabel("value", new Model(value)) { @Override public void onSubmit(AjaxRequestTarget target) { super.onSubmit(target); //here I also try to get the editor //and add a SimpleAttributeModifier //with a javaScript for onBlur //event, but that script is not //working as I am not able to //append that script to the //editor's existing ajax String input = (String) getModelObject(); if (input != null) { taskTypeSettingsFormModel.getTaskTypeList().set(index, input); } } }; label.setRequired(true); item.add(star); label.setOutputMarkupId(true); label.add(new SimpleAttributeModifier("style", "cursor: pointer; cursor: hand;")); label.add(new AbstractValidator() { @Override protected void onValidate(IValidatable validatable) { String value = (String) validatable.getValue(); Pattern pattern = Pattern.compile("^[a-zA-Z0-9]+$"); Matcher matcher = pattern.matcher(value); if (!matcher.matches()) { error(validatable); } } @Override protected String resourceKey() { return "task_type_settings_form.error.regexFailure"; } }); item.add(label); item.add(removeLink("removeLink", item)); item.add(moveUpLink("up", item)); item.add(moveDownLink("down", item)); } }; listView.setOutputMarkupId(true); listView.setReuseItems(true); div.add(listView); //some code } @Override protected void validate() { filter.reset(); super.validate(); } @Override public void onSubmit() { TaskTypeSettingsFormModel taskTypeSettingsFormModel = (TaskTypeSettingsFormModel) getModelObject(); for (String str : taskTypeSettingsFormModel.getTaskTypeList()) { System.out.println(str); } } } 

希望我能解释一下这个场景。 任何有关这方面的信息对我都非常有帮助。 谢谢。

你可以通过一种行为来代替标签

 public class RequiredStarBevaviour extends AbstractBehavior { @Override public void beforeRender(final Component component) { super.beforeRender(component); if (component instanceof FormComponent) { if (!((FormComponent) component).checkRequired()) { component.getResponse() .write("*"); } } } 

}

这将在每次渲染组件时运行,它将检查它是否为表单组件,如果不满足所需的检查,它将呈现星形。

编辑回答问题:

 final AjaxEditableLabel label = new AjaxEditableLabel("value", new Model(value)) { @Override protected FormComponent newEditor(final MarkupContainer parent, final String componentId, final IModel model) { final FormComponent newEditor = super.newEditor(parent, componentId, model); newEditor.add(new RequiredStarBevaviour()); return newEditor; } @Override public void onSubmit(final AjaxRequestTarget target) { super.onSubmit(target); // here I also try to get the editor // and add a SimpleAttributeModifier // with a javaScript for onBlur // event, but that script is not // working as I am not able to // append that script to the // editor's existing ajax final String input = (String) getModelObject(); if (input != null) { taskTypeSettingsFormModel.getTaskTypeList().set(index, input); } } }; 

@Tnem你的解决方案完美无缺。 稍微调整一下我所展示的内容后,对未来的用户可能会有所帮助:

  AjaxEditableLabel taskTypeEditableLabel = new AjaxEditableLabel("taskTypeEditableLabel", new Model(value)) { private static final long serialVersionUID = 10061L; @Override public void onSubmit(AjaxRequestTarget target) { super.onSubmit(target); String input = (String) getModelObject(); if (input != null) { taskTypeSettingsFormModel.getTaskTypeList().set(index, input); } } @Override protected FormComponent newEditor(MarkupContainer parent, String componentId, IModel model) { FormComponent editor = super.newEditor(parent, componentId, model); editor.add(new AbstractBehavior() { private static final long serialVersionUID = 10062L; @Override public void beforeRender(final Component component) { super.beforeRender(component); if (component instanceof FormComponent) { if (!((FormComponent) component).checkRequired()) { component.getResponse().write("*"); } } } @Override public void onComponentTag(Component component, ComponentTag tag) { super.onComponentTag(component, tag); if (component instanceof FormComponent) { tag.put("style", "width: 400px"); if (!((FormComponent) component).isValid()) { tag.put("style", "width: 400px; border: 1px solid #CC2200;"); } } } }); editor.add(new AbstractValidator() { private static final long serialVersionUID = 10063L; @Override protected void onValidate(IValidatable validatable) { String value = (String) validatable.getValue(); Pattern pattern = Pattern.compile("([AZ]+)((([\\w\\s-//]*)[\\w&&[^_]]+)?)"); Matcher matcher = pattern.matcher(value); if (!matcher.matches()) { error(validatable); } } @Override protected String resourceKey() { return "task_type_settings_form.error.regexFailure"; } }); editor.setRequired(true); return editor; } @Override protected Component newLabel(MarkupContainer parent, String componentId, IModel model) { Component label = super.newLabel(parent, componentId, model); label.add(new AbstractBehavior() { private static final long serialVersionUID = 10064L; @Override public void onComponentTag(Component component, ComponentTag tag) { super.onComponentTag(component, tag); if (component instanceof Component) { tag.put("style", "cursor: pointer; cursor: hand;"); } } }); return label; } }; taskTypeEditableLabel.setOutputMarkupId(true); 

尝试:

star标设置为在init上隐藏:

 star.setVisible(false); 

提交表单时,根据input显示star (并添加到AjaxRequestTarget ):

 String input = (String) getModelObject(); // From your code star.setVisible("".equals(input)); target.add(star); // Or is it addComponent()? Can't remember :-S