好的,所以标题很混乱,这个问题可能也是我对整个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;
}
}
答案 0 :(得分:0)
但如果我把它放在菜单下面,则用户输入不再可读
您的代码类型依赖于getter和setter方法的执行顺序(如果您启用调试日志记录或启动开发人员控制台,您将看到get / set语句的顺序类型为匹配表达式在页面上显示的顺序......但是,您有机会看到不止一次触发的内容!)。
Salesforce建议不要依赖get / set fire的顺序,如果setOther
被调用一次或10次,你的应用程序就不应该关心(所以你不应该有复杂的查询作为一方 - 例如setter中的影响。)
我假设你已经有了一些动作方法(某些东西被绑定到apex:commandButton或者apex:commandLink) - 你应该将这个逻辑从setter转移到该方法。你有自己的方法,或者你使用的是StandardController&#39; s {!save}
?
进一步阅读:
编辑 - 您已经提到过您正在寻找一些提交而无需用户点击任何按钮。检查这样的东西是否接近你需要的东西。
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>