選択リストで apex:actionSupportのRerenderが効かない時の対処法

四時間ほど迷ってました。

#やりたい事
こんな感じで単純に選択された値を別のエリアに表示したい。

<img width="412" alt="スクリーンショット 2016-02-02 23.08.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/17da6049-9505-b6b0-3024-f95d844edd2e.png">
<img width="404" alt="スクリーンショット 2016-02-02 23.08.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/ce739bd9-1d4d-ab39-3b92-13f14faf14e8.png">
<img width="419" alt="スクリーンショット 2016-02-02 23.08.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/9ea4c1d0-88db-c84f-0874-6f2f400d5769.png">

```html:SelectListAndInputField.vfp
<apex:page controller="SelectListAndInputFieldController">
    <apex:form >
        <apex:pageBlock title="選択リストの onchange で rerender の確認">
            業種:
            <apex:inputField value="{!newAccount.Industry}" />
                <apex:inputField value="{!newAccount.Industry }" >                    
            <apex:actionSupport event="onchange" reRender="result"/>                    
        </apex:pageBlock>
    </apex:form>
    
    <!-- rerender される領域 -->
    <apex:outputPanel id="result">
        <apex:outputText >選択されている値: {!newAccount.Industry}</apex:outputText>
    </apex:outputPanel>
</apex:page>
```
※コントローラーは↓



#躓いたところ
別の項目を追加したところ、値が取れなくなった！！というか、どうやらRerenderがうまく動作していないようだ。
どうなってんだ・・・
<img width="433" alt="スクリーンショット 2016-02-02 23.12.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/07a5888f-9027-3967-fe4c-04be18234e19.png">
<img width="406" alt="スクリーンショット 2016-02-02 23.12.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/a611df59-452a-dca7-c663-befb2b174038.png">
<img width="423" alt="スクリーンショット 2016-02-02 23.12.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/a02e0d17-4668-0a0f-f242-ae96886bcb54.png">

```html:SelectListAndInputField.vfp
<apex:page controller="SelectListAndInputFieldController">
    <apex:form >
        <apex:pageBlock title="選択リストの onchange で rerender の確認">
            名前:<apex:inputField value="{!newAccount.name}" />  <!-- **追加** -->
            業種:
            <apex:inputField value="{!newAccount.Industry}" />
                <apex:inputField value="{!newAccount.Industry }" >                    
            <apex:actionSupport event="onchange" reRender="result"/>                    
        </apex:pageBlock>
    </apex:form>
    
    <!-- rerender される領域 -->
    <apex:outputPanel id="result">
        <apex:outputText >選択されている値: {!newAccount.Industry}</apex:outputText>
    </apex:outputPanel>
</apex:page>
```
※コントローラーは↓
#解決
`apex:actionRegion` で囲むとうまくいきました。
どうやら、`newAccount.name`は必死項目のため空欄のままではサーバーに接続できず、rerender処理が行えない状態になっていた模様。
`apex:actionRegion`は囲った部分だけをサーバーに送ってくれるので、空欄の必須項目は無視してくれるとのこと。

```html:SelectListAndInputField.vfp
<apex:page controller="SelectListAndInputFieldController">
    <apex:form >
        <apex:pageBlock title="選択リストの onchange で rerender の確認">
            名前:<apex:inputField value="{!newAccount.name}" />
            業種:
            <apex:actionRegion>
                <apex:inputField value="{!newAccount.Industry}" />
                    <apex:inputField value="{!newAccount.Industry }" >                    
                <apex:actionSupport event="onchange" reRender="result"/>                    
            </apex:actionRegion>
        </apex:pageBlock>
    </apex:form>
    
    <!-- rerender される領域 -->
    <apex:outputPanel id="result">
        <apex:outputText >選択されている値: {!newAccount.Industry}</apex:outputText>
    </apex:outputPanel>
</apex:page>
```


```java:SelectListAndInputFieldController.apxc
public class SelectListAndInputFieldController {
    public Account newAccount {get;set;}
    public SelectListAndInputFieldController(){        
        newAccount = new Account();
    }     
}
```

#応用 ~連動項目での対処法~
連動選択リストの場合は制御側も含めて `actionRegion` で囲いましょう

<img width="408" alt="スクリーンショット 2016-02-02 23.24.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/7cf5faf9-4eef-3040-fc62-26afbd385729.png">
<img width="409" alt="スクリーンショット 2016-02-02 23.24.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/1e6a66cd-9e88-255c-a52c-4aa00ada8861.png">
<img width="411" alt="スクリーンショット 2016-02-02 23.25.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/21e114c2-382e-1bdd-d328-eb839def11ae.png">


```html:SelectListAndInputField.vfp
<apex:page controller="SelectListAndInputFieldController">
    <apex:form >
        <apex:pageBlock title="選択リストの onchange で rerender の確認">
            名前:<apex:inputField value="{!newAccount.name}" />
            業種:
            <apex:actionRegion>
                <apex:inputField value="{!newAccount.Industry}" />
                <!-- ↑制御項目 ↓は連動項目 -->
                <apex:inputField value="{!newAccount.depPickList__c }" >                    
                    <apex:actionSupport event="onchange" reRender="result"/>                    
                </apex:inputField>
            </apex:actionRegion>
        </apex:pageBlock>
    </apex:form>
    
    <!-- rerender される領域 -->
    <apex:outputPanel id="result">
        <apex:outputText >選択されている値: {!newAccount.depPickList__c}</apex:outputText>
    </apex:outputPanel>
</apex:page>
```
※コントローラーは↑


#参考にしたサイト
- [Render fields based on picklist value](https://developer.salesforce.com/forums/?id=906F0000000991UIAQ)