0

我在清除自动完成文本字段的输入时遇到问题。出于某种原因,每当我调用 target.add(reference to AutoCompleteTextField);

我的输入值为空...

所以基本上,我可以清除存储输入的引用字符串,但每次我调用 ajaxupdate 时它都为空。

我尝试了 ajaxButton 和 AjaxSubmitLink。两者得到相同的反应。我有一个按钮来提交来自 textField 的输入。

代码:

        <form wicket:id="autoCompleteForm">
          <td><input wicket:id="autoCompleteTextField" size="20"/></td>
          <td><button width:100px wicket:id="selectRoleBtn">Select</button></td>    
        </form>


private void autoCompleteForm()
{
    findRoleForm = new Form<Void>("autoCompleteForm");
    findRoleForm.setOutputMarkupId(true);
    addOrReplace(findRoleForm);
    field = new AutoCompleteTextField<String>("autoCompleteTextField",
            new PropertyModel<String>(this,"autoString"))
        {
            @Override
            protected Iterator<String> getChoices(String input)
            {
                if (Strings.isEmpty(input))
                {
                    List<String> emptyList = Collections.emptyList();
                    return emptyList.iterator();
                }

                List<String> choices = new ArrayList<String>(10);

                for (final Role role : rolesList)
                {

                    final String roles = role.getRoleName();

                    if (roles.toUpperCase().startsWith(input.toUpperCase()))
                    {
                        choices.add(roles);
                        if (choices.size() == 10)
                        {
                            break;
                        }
                    }
                }

                return choices.iterator();
            }
        };
        findRoleForm.addOrReplace(field);
        findRoleForm.addOrReplace(new AjaxSubmitLink("selectRoleBtn", findRoleForm)
        {
            protected void onSubmit(AjaxRequestTarget target, Form<?> form)
            {
                System.out.println("here1" + autoString);
                if(rolesList  != null && autoString!= null)
                {
                    if(rolesList .size() != 0)
                    {   
                        for(int i=0; i < rolesList .size(); i++)
                        {
                            System.out.println("here2" + autoString);
                            if(rolesList .get(i).getRoleName().equals(autoString))
                            {
                                role = rolesList.get(i);

                                roleInformation.addOrReplace(new Label("roleNameTxt", role.getRoleName()));
                                roleInformation.addOrReplace(new Label("roleAliasTxt", role.getRoleAlias()));
                                roleInformation.addOrReplace(new Label("roleOwnerTxt", role.getRoleOwnerId()));
                                roleInformation.addOrReplace(new Label("roleStatusTxt", role.getRoleAccessStatus()));
                                roleInformation.addOrReplace(new Label("roleCategoryTxt", role.getRoleCategoryName()));
                                roleInformation.addOrReplace(new Label("roleDescriptionTxt", role.getRoleDescription()));
                                roleInformation.addOrReplace(new Label("roleValidityTxt", role.getRoleValidityStatus()));
                                roleInformation.addOrReplace(new Label("roleNumUsers", ""));


                                //add adOrReplace(findRoleForm);
                                autoString = "";
                                target.add(field);
                                target.add(roleInformation);
                                currentRoleSelection = null;
                                target.add(rolesDropDownChoice);
                                break;
                            }
                        }
                    }
               }
            }
        }).add(getIndicatorAppender());
}

编辑: autoCompleteTextField 输入字段第一次清除,但是当我再次尝试时。string: autoString 将为空。因此,如果您在第一次尝试时选择您的选择(从提供的搜索列表中),点击选择按钮,它会为您提供正确的字符串并清除。但是当您第二次选择提供的值时,“autoString”将为空......并且不会获得分配给它的输入值。

4

2 回答 2

0

我可以通过将其他组件放入与 autoCompleteTextField 相同的表单中来解决此问题。无论出于何种原因,当这些组件被重新渲染并且它们位于表单中时。它可以解决问题。

于 2013-09-09T17:17:53.253 回答
0

你能更恰当地描述你的问题吗?

我不得不修改你的代码来编译它

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.util.string.Strings;

public class AutoTestPage2 extends WebPage {

    Form<Void> findRoleForm;
    AutoCompleteTextField field;
    List<Role> rolesList = new LinkedList<AutoTestPage2.Role>();
    String autoString;

    public AutoTestPage2() {
        super();
        autoCompleteForm();
    }

    private void autoCompleteForm() {
        rolesList.add(new Role("Adam"));
        rolesList.add(new Role("Boris"));
        rolesList.add(new Role("Clair"));

        findRoleForm = new Form<Void>("autoCompleteForm");
        findRoleForm.setOutputMarkupId(true);
        add(findRoleForm);
        field = new AutoCompleteTextField<String>("autoCompleteTextField",
                new PropertyModel<String>(this, "autoString")) {
            @Override
            protected Iterator<String> getChoices(final String input) {
                if (Strings.isEmpty(input)) {
                    final List<String> emptyList = Collections.emptyList();
                    return emptyList.iterator();
                }

                final List<String> choices = new ArrayList<String>(10);

                for (final Role role : rolesList) {

                    final String roles = role.getName();

                    if (roles.toUpperCase().startsWith(input.toUpperCase())) {
                        choices.add(roles);
                        if (choices.size() == 10) {
                            break;
                        }
                    }
                }

                return choices.iterator();
            }
        };
        findRoleForm.addOrReplace(field);
        findRoleForm.addOrReplace(new AjaxSubmitLink("selectRoleBtn", findRoleForm) {
            @Override
            protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                System.out.println("here1" + autoString);
                if (rolesList != null && autoString != null) {
                    if (rolesList.size() != 0) {
                        for (int i = 0; i < rolesList.size(); i++) {
                            System.out.println("here2" + autoString);
                            if (rolesList.get(i).getName().equals(autoString)) {
                                final Role role = rolesList.get(i);

                                //                                roleInformation.addOrReplace(new Label("roleNameTxt", role.getName()));

                                //add adOrReplace(findRoleForm);
                                autoString = "";
                                target.add(field);
                                //                                target.add(roleInformation);
                                //                                currentRoleSelection = null;
                                //                                target.add(rolesDropDownChoice);
                                break;
                            }
                        }
                    }
                }
            }
        })/* .add(getIndicatorAppender()) */;

        //        add(findRoleForm);
    }

    class Role implements Serializable {

        String name;

        public Role(final String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(final String name) {
            this.name = name;
        }

    }
}

当我按下选择时,文本字段被清除并且控制台中有两条消息

here1Adam
here2Adam
于 2013-09-09T16:47:40.570 回答