2014-10-31 13 views
1

我正在使用兩個<s:select>標記和java集合List處於其列表屬性。刷新<s:select>在Struts 2中更改後備Java集合的標記

關於我想要填充第二個下拉列表的更改。我爲此使用了jQuery,它被稱爲動作bean,並在返回時使用JSON響應填充列表,然後在第二個下拉列表中設置值。一切工作正常。 JQuery代碼如下所示。

$(document).ready(function() { 
    $('#projectNameBox').change(function (event) { 
     var projectNameBoxVal = $("select#projectNameBox").val(); 
     alert(projectNameBoxVal); 
     $.getJSON('getPackageListAction.action', { 
      "projectId": projectNameBoxVal 
     }, function (jsonResponse) { 
      alert(jsonResponse); 
      var packageNameSelectBox = $('#packageNameBox'); 
      packageNameSelectBox.find('option').remove(); 
      $.each(jsonResponse, function (key, value) { 
       $('<option>').val(key).text(value).appendTo(packageNameSelectBox); 
      }); 
     }); 
    }); 
}); 

現在我擔心的是,當我通過調用在第一次的變化採取行動更新到第二襯裏列表中,那麼爲什麼我要使用下面的代碼來設置選項的數據。

var packageNameSelectBox = $('#packageNameBox'); 
packageNameSelectBox.find('option').remove(); 
$.each(jsonResponse, function (key, value) { 
    $('<option>').val(key).text(value).appendTo(packageNameSelectBox); 
}); 

我們是否可以刷新組件以反映備份列表的變化?

回答

0

該代碼用於修改第二個select對象的HTML DOM元素以反映數據模型中的更改。如果這是一個雙選的情況下,那麼你應該重新填充第二選擇的數據,並返回json結果。

您傳遞Ajax調用應該由第一select的價值屬性,當你做的第一個選擇框中的選項選擇設置的參數projectId。此參數設置爲可用於爲第二個選擇框重新填充地圖的操作屬性。

數據已經建立了一對多的關係(項目< - 包),因此您可以爲單個項目使用不同的包。

一旦設置了projectId的參數,只能查詢屬於該項目id的包,該包等於包projectId

當第二個選擇框的數據準備就緒時,您將返回json結果,該結果將與第二個選擇框對應的屬性序列化爲JSON對象。

對於每個選擇框,您應該有不同的操作屬性。這有助於限制json輸出只序列化第二個選擇框的屬性。

一旦JSON返回給客戶端,那麼您需要修改第二個選擇框的DOM,它只是無法從您在Ajax回調中收到的JSON更新自身。

您可以通過代碼示例查看問題:Populating one select menu based on another select menu using AJAX in Struts2

0

select組件(與頁面中的任何其他對象一樣)對它的創建方式一無所知。一旦組件生成後,它就不再有任何類型的服務器端連接。

然後你需要到(沿和DOM)改變其HTML來進行更改,有沒有像刷新一堆文字,「HTML關鍵字」的。

有些工具可以隱藏這種複雜性(不管你已經處理了,如果代碼來自你而不是你的同事),通過爲程序員提供一個更簡單的接口。他們在引擎蓋下做同樣的事情,但他們會爲你節省工作。

一個例子是Struts2-jquery-plugin; take a look at the code for a double select

考慮到使用插件,您需要繼續使用S2技術,同時學習原始jQuery將在您將來更改框架(JSF2,SpringMVC,ecc)或甚至語言/平臺(C#/ .NET)時幫助您等等......)。