заполнить одно выпадающее меню для выбора другого, используя тэги - PullRequest
1 голос
/ 25 октября 2011

У меня есть два выпадающих списка. Я хочу заполнить второй раскрывающийся список при выборе первого раскрывающегося списка. Для этого я использую struts-dojo-tags.

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>
<html>
<head>
<title>Welcome</title>
<script>
</script>
<sx:head />
</head>
<body>
<h2>Struts 2 + Ajax Example 2!</h2>
<s:form name="f1">
<s:textfield name="proj" label="Project Name" />
<s:url id="url" value="/populateStates.action" />
<s:select id="id1" list="countryList"
    listKey="countryId" listValue="countryName" headerKey="0"
    headerValue="-Select-" label="Country"/>
<s:select id="id2" list="list2" listKey="stateId"
    listValue="stateName" headerKey="0" headerValue="-Select-"
    label="State" />
<sx:bind sources="id1" targets="id2" events="onchange"
    href="%{#url}" />
</s:form>
<br>
</body>
</html>

В моем классе действий есть два метода действий.

        public String populateCountry() throws Exception{

    list1 = new ArrayList<Country>();
    list1.add(new Country(1, "Country1"));
    list1.add(new Country(2, "Country2"));
    list1.add(new Country(3, "Country3"));

    return SUCCESS;
}

public String populateStates() throws Exception{

    System.out.println("populateStates******************"+id1);

    list2 = new ArrayList<State>();

    if (id1 != null && !id1.equals("")) 
    {   
        if(id1.equals("1"))
        {
            list2.add(new State(1, "UMB1"));
            list2.add(new State(2, "UMB2"));
            list2.add(new State(3, "UMB3"));
        }
        else if(id1.equals("2"))
        {
            list2.add(new State(4, "UMB4"));
            list2.add(new State(5, "UMB5"));
            list2.add(new State(6, "UMB6"));
        }
        else if(id1.equals("3"))
        {
            list2.add(new State(7, "UMB7"));
            list2.add(new State(8, "UMB8"));
            list2.add(new State(9, "UMB9"));
        }       
    }
    return SUCCESS;
}

Первый метод действия вызывается, когда jsp загружается впервые (с заполненным Country раскрывающимся списком), а второй метод действия вызывается, когда я выбираю страну из раскрывающегося списка Country.

Проблема: States выпадающий список не заполняется. Когда я отлаживаю код, я вижу, что когда управление достигает populateStates, все переменные моего класса Action сбрасываются (id1, id2, list1, list2, proj). Из-за чего я получаю пустой выпадающий список состояний. Пожалуйста, помогите мне решить эту проблему.

1 Ответ

1 голос
/ 25 октября 2011

Я не думаю, что <sx:bind> делает то, что, как вы думаете, делает; HTML-код цели будет заменен тем, что возвращает действие.

Вы могли бы попробовать вернуть просто список <option> с (и, возможно, это то, что вы делаете), но я не верю, что это сработает. (Если это так, обязательно ответьте своим собственным ответом.)

Я бы действительно рекомендовал использовать плагин jQuery; теги Dojo уже давно устарели, используют очень устаревшую версию Dojo, и с ней часто приходится работать.

Другой вариант - просто использовать старый добрый jQuery (или библиотеку по вашему выбору) - это почти всегда проще, чем реализовать пользовательские функции через библиотеку тегов. Библиотеки тегов Ajax отлично подходят для действительно простых случаев использования, но как только что-то появится, я не уверен, что они сэкономят много усилий. YMMV.

...