首先我想说,虽然在.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);
}
}
}
希望我能解释一下这个场景。任何有关这方面的信息对我都非常有帮助。谢谢。
答案 0 :(得分:3)
您可以使用行为
来替代标签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("<span class='redclass'>*</span>");
}
}
}
}
这将在每次渲染组件时运行,它将检查它是否为表单组件,如果不满足所需的检查,它将呈现星号。
编辑回答问题:
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);
}
}
};
答案 1 :(得分:1)
@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("<span style='color: red; margin-right: 5px;'>*</span>");
}
}
}
@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("([A-Z]+)((([\\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);
答案 2 :(得分:0)
尝试:
将star
标签设置为在init上隐藏:
star.setVisible(false);
提交表单后,根据star
显示input
(并添加到AjaxRequestTarget
):
String input = (String) getModelObject(); // From your code
star.setVisible("".equals(input));
target.add(star); // Or is it addComponent()? Can't remember :-S