之前的一篇介紹過關於salesforce手動配置關聯關系實現PickList的聯動效果,但是現實的開發中,很多數據不是定死的,應該通過ajax來動態獲取,本篇講述通過JavaScript Remoting 方式實現聯動效果。
一、JavaScript Remoting簡單介紹

上圖為PDF中基本介紹,在VF中調用格式如下:
1 Visualforce.remoting.Manager.invokeAction (
'{!$RemoteAction.MyController.myFunction}', 2 param1,param2, 3 function(result, event){ 4 //TODO 處理返回結果 5 }, 6 {escape: true} 7 );
其中需要在MyController的myFunction上通過@RemoteAction注解標識一下,即
1 public class MyController { 2 @RemoteAction 3 public returnType myFunction(param1,param2) { 4 //returnType為方法需要返回的類型 5 } 6 }
二.聯動制作
1.省市關聯表制作
省和市具有關聯關系,不同的省對應着不同的城市。設計省市關聯表:Province_City__c,主要字段包括Name(存儲省或市名稱),ID__c(編號),Parent_ID__c(此記錄對應的父)以及Order_Number__c(此條記錄的排序號)
並添加幾條記錄,記錄如下所示:

2.ProvinceCityController的制作
此類中應該實現以下功能:
1.加載需要顯示的省;
2.選中某個省后通過省得ID獲取此省對應所有的市。
類的內容如下所示:
1 public with sharing class ProvinceCityController { 2 3 public List<SelectOption> provinceOptionList{get;set;} 4 5 public String provinceId{get;set;} 6 7 public static String cityId{get;set;} 8 9 public ProvinceCityController() { 10 List<Province_City__c> provinceList = [select Id,Name,ID__c from Province_City__c where Parent_Id__c = '0' order by Order_Number__c asc]; 11 if(provinceList == null) { 12 provinceList = new List<Province_City__c>(); 13 } 14 provinceOptionList = new List<SelectOption>(); 15 for(Province_City__c province : provinceList) { 16 provinceOptionList.add(new SelectOption(province.ID__c,province.Name)); 17 } 18 } 19 20 @RemoteAction 21 public static List<Province_City__c> getCityListByProvince(String provinceId) { 22 List<Province_City__c> cityList; 23 if(provinceId != null && provinceId.length() > 0) { 24 cityList = [select Id,Name,ID__c from Province_City__c where Parent_Id__c = :provinceId order by Order_Number__c asc]; 25 } 26 if(cityList == null) { 27 cityId = null; 28 cityList = new List<Province_City__c>(); 29 } 30 return cityList; 31 } 32 }
3.ProvinceCityPage頁面制作
頁面中包含兩個下拉框,選擇省以后才可以顯示市,選擇市以后彈出對話框顯示市的ID__c
頁面代碼如下:
1 <apex:page controller="ProvinceCityController"> 2 <apex:form id="form"> 3 <apex:selectList value="{!provinceId}" id="province" multiselect="false" size="1" onchange="showCity();"> 4 <apex:selectOption itemLabel="--None--" itemValue="--None--" rendered="{!if(provinceId==null,true,false)}" /> 5 <apex:selectOptions value="{!provinceOptionList}"> 6 </apex:selectOptions> 7 </apex:selectList> 8 9 <apex:selectList value="{!cityId}" id="city" multiselect="false" size="1" onchange="showDetail();"> 10 <apex:selectOption itemLabel="--None--" itemValue="--None--" rendered="{!if(cityId==null,true,false)}" /> 11 </apex:selectList> 12 </apex:form> 13 14 <script> 15 function showCity() { 16 var provinceId = document.getElementById("{!$Component.form.province}").value; 17 console.log(provinceId); 18 Visualforce.remoting.Manager.invokeAction ( 19 '{!$RemoteAction.ProvinceCityController.getCityListByProvince}', 20 provinceId, 21 function(result, event){ 22 //clear options 23 document.getElementById("{!$Component.form.city}").length = 0; 24 if (event.status) { 25 if(result != null && result.length > 0) { 26 for(var i=0;i<result.length;i++) { 27 var tempOption = new Option(); 28 tempOption.value=result[i].ID__c; 29 tempOption.text = result[i].Name; 30 document.getElementById("{!$Component.form.city}").add(tempOption); 31 } 32 } else { 33 var tempOption = new Option(); 34 tempOption.value= '--None--'; 35 tempOption.text = '--None--'; 36 document.getElementById("{!$Component.form.city}").add(tempOption); 37 } 38 } 39 }, 40 {escape: true} 41 ); 42 } 43 44 function showDetail() { 45 var cityId = document.getElementById("{!$Component.form.city}").value; 46 alert(cityId); 47 } 48 </script> 49 </apex:page>
顯示效果如下所示:

當選擇黑龍江以后,右側的市便會顯示黑龍江省所包含的市。

當選中具體的市的item,會彈出此城市對應的ID__c。

總結:項目中實現關聯主要用到的是js Remoting,只要掌握其基本寫法,遠程調用請求寫法將會很簡單方便,代碼中只是實現基本功能,未作相關的check,有興趣的朋友可以自己添加以及完善。
