本文介绍了Wicket- AjaxEditableLabel 的 RequiredFieldValidator的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

At first I want to say, although RequiredFieldValidator is used in .NET but I use this term for wicket as I want to mean a Label (color: red and text: *) which will be be displayed beside AjaxEditableLabel when the editor of the AjaxEditableLabel will be blank. I have set AjaxEditableLabel.setRequired(true) and it is working, i.e., the Form cannot be submitted. But I am not able to track that red star Label beside the AjaxEditableLabel. What I did so far is :

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);
        }
    }
}

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

Hope I can explain the scenario. Any information regarding this will be very helpful to me. Thank you.

推荐答案

与其挂着标签,不如用行为来做

Instead of having a label hanging around, you could do it with a behaviour

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>");
        }
    }
}

}

这将在每次渲染组件时运行,它会检查它是否是一个表单组件,如果没有满足所需的检查,它将渲染星星.

This will run each time the component is rendered, it will check if its a form component and if the required check is not met it will render the star.

编辑对问题的回答:

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);
                }
            }
        };

这篇关于Wicket- AjaxEditableLabel 的 RequiredFieldValidator的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-11 01:57