Visualforce不读取元素下面的变量

时间:2014-07-02 14:49:47

标签: salesforce visualforce apex

好的,所以标题很混乱,这个问题可能也是我对整个VF / Apex事物的新手,并且不知道正确的术语。 这个想法是当用户选择其中一个选项(“其他”)时,控制器会将文本框(!otherString)的值连接到自定义对象中。 issuse是我希望输入文本框在选择菜单下方,但如果我把它放在菜单下面,则用户输入不再可读。

这有效:

    <apex:inputText value="{!otherString}" id="otherText" />
    <apex:selectCheckboxes layout="PageDirection" value="{!other}" id="standardMap" required="true">                    
          <apex:selectOptions value="{!shareTypes}" />
    </apex:selectCheckboxes>

输出:“其他:模型”(“模型”是用户输入的任何内容)

这不起作用:

    <apex:selectCheckboxes layout="PageDirection" value="{!other}" id="standardMap" required="true">                    
          <apex:selectOptions value="{!shareTypes}" />
    </apex:selectCheckboxes>
    <apex:inputText value="{!otherString}" id="otherText" />

输出:“Other:null”(null因为它无法读取文本框)

相关控制器代码:

List<String> other = new List<String>{};
public String otherString{get;set;}

      public List<String> getOther() {
          return other;
      }  

      public void setOther(List<String> other) {

           Set<String> mySet = new Set<String>();
           mySet.addAll(other);
           if (mySet.Contains('Other'))
           {        

              String result = String.join(other, ', ' );
              control.Share_Types__c = result + ': ' +otherString;

           }
           else
           {
                String result = String.join(other, ', ' );
                control.Share_Types__c = result;
           }
       }

1 个答案:

答案 0 :(得分:0)

  

但如果我把它放在菜单下面,则用户输入不再可读

您的代码类型依赖于getter和setter方法的执行顺序(如果您启用调试日志记录或启动开发人员控制台,您将看到get / set语句的顺序类型为匹配表达式在页面上显示的顺序......但是,您有机会看到不止一次触发的内容!)。

Salesforce建议不要依赖get / set fire的顺序,如果setOther被调用一次或10次,你的应用程序就不应该关心(所以你不应该有复杂的查询作为一方 - 例如setter中的影响。)

我假设你已经有了一些动作方法(某些东西被绑定到apex:commandButton或者apex:commandLink) - 你应该将这个逻辑从setter转移到该方法。你有自己的方法,或者你使用的是StandardController&#39; s {!save}

进一步阅读:


编辑 - 您已经提到过您正在寻找一些提交而无需用户点击任何按钮。检查这样的东西是否接近你需要的东西。

enter image description here

public class Checkboxes{

    public List<SelectOption> options {get;private set;}
    public List<String> selected {get;set;}

    public Boolean otherSelected {get; private set;}
    public String otherOption {get;set;}

    public transient String output {get; private set;}

    public Checkboxes(){
        options = new List<SelectOption>{
            new SelectOption('Apex', 'Apex'),
            new SelectOption('JavaScript', 'JavaScript'),
            new SelectOption('Visualforce', 'Visualforce'),
            new SelectOption('Other', 'Other')
        };
        selected = new List<String>();
        otherSelected = false;
    }

    public void skillsChanged(){
        try{
            Set<String> temp = new Set<String>();
            temp.addAll(selected);

            otherSelected = temp.contains('Other');

            if(otherSelected){
                output =  'Other : ' + (String.isBlank(otherOption) ? '<not specified>' : otherOption);
            } else {
                output = String.join(selected, ', ');
            }
            System.debug(output);
        } catch(Exception e){
            ApexPages.addMessages(e);
        }
    }
}

<apex:page controller="Checkboxes" tabStyle="Account">
<apex:pageMessages />
<apex:form>
    <apex:pageblock id="block">
        <apex:pageBlockButtons location="top">
            <apex:actionStatus id="status">
                <apex:facet name="start"><img src="/img/loading.gif" alt="Loading" title="Loading"/></apex:facet>
            </apex:actionStatus>
        </apex:pageBlockButtons>

        <apex:pageBlockSection title="input" columns="1">
            <apex:selectCheckboxes label="Your skills" value="{!selected}" required="true">                    
                <apex:selectOptions value="{!options}" />
                <apex:actionSupport action="{!skillsChanged}" event="onchange" status="status" rerender="messages, block"/>
            </apex:selectCheckboxes>

            <apex:inputText label="Please Specify" value="{!otherOption}" rendered="{!otherSelected}">
                <apex:actionSupport action="{!skillsChanged}" event="onchange" status="status" rerender="messages, text"/>
            </apex:inputText>
        </apex:pageBlockSection>

        <apex:pageBlockSection title="output">
            <apex:outputText value="{!output}" id="text"/>
        </apex:pageBlockSection>
    </apex:pageBlock>
</apex:form>
</apex:page>