Wicket- RequiredFieldValidator для AjaxEditableLabel

#java #wicket

#java #wicket

Вопрос:

Сначала я хочу сказать, хотя RequiredFieldValidator используется в .NET, но я использую этот термин для 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);
        }
    }
}
  

Надеюсь, я смогу объяснить сценарий. Любая информация, касающаяся этого, будет для меня очень полезной. Спасибо.

Комментарии:

1. К вашему сведению, вам не нужно включать «Wicket-» в свои заголовки; на этом сайте теги служат для этой цели. Кроме того, мы обычно предпочитаем не использовать здесь строки «привет / спасибо». Приветствия, в частности, занимают место при предварительном просмотре вопроса в результатах поиска.

2. @Lord Torgamus Я буду иметь в виду ваше предложение. Я включил Wicket в заголовок, поскольку использовал термин RequiredFieldValidator в своем вопросе, и этот термин скорее не связан с Java ASP.NET.

3. Я думаю, что RequiredFieldValidator (или подобное) есть во всех мыслимых веб-технологиях 🙂

4. @Sean Patrick Floyd Я согласился.

Ответ №1:

Вместо того, чтобы вешать ярлык, вы могли бы сделать это с помощью поведения

 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. @Tnem Спасибо. Итак, я могу добавить это поведение в AjaxEditableLabel?. Одна вещь, которую я хочу сказать, я добавил AjaxFormComponentUpdatingBehavior к этой AjaxEditableLabel , но она выдавала исключение, сообщающее, что оно может быть добавлено только к FormComponent, является ли AjaxEditableLabel компонентом формы?

2. @Tapas Bose Нет, это панель, но она содержит редактор компонентов формы, поэтому вы можете добавить это поведение в label.getEditor()

3. @Tnem AjaxEditableLabel.getEditor() является защищенным методом. Не так ли? Как я могу вызвать label.getEditor()?

4. @Tapas Bose Верно, вы, вероятно, захотите переопределить метод newEditor и добавить его при создании редактора.

5. @Tnem Я не знаю, как переопределить newEditor(), это что-то вроде: super.newEditor(parent, componentID, model); FormComponent editor = getEditor(); editor.add(new RequiredStarBevaviour()); Это правильно? К сожалению, у меня сейчас нет моего проекта, поэтому я не могу его протестировать, и я не могу найти какой-либо пример через Интернет, касающийся переопределения метода newEditor(). Спасибо.

Ответ №2:

@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-//]*)[\wamp;amp;[^_]] )?)");
                                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);
  

Ответ №3:

Попробуйте:

Установите star метку как скрытую при инициализации:

 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
  

Комментарии:

1. Спасибо за ответ. В методе onSubmit я сделал, если входные данные равны нулю или «», затем отобразил предупреждение. Но после добавления setRequired true к AJaxEditableLabel он перестал работать. Я больше не могу получить getModelObject для свободного текстового поля.

2. @Tapas Bose Это я не могу объяснить, поскольку прошло довольно много времени с тех пор, как я в последний раз брал в руки проект Wicket. Это стоило попробовать, но, боюсь, я действительно не могу вспомнить внутренности форм и поведение проверки.