Salesforce 无法将组件属性与控制器绑定

Salesforce 无法将组件属性与控制器绑定,salesforce,apex-code,visualforce,Salesforce,Apex Code,Visualforce,我正在尝试开发一个visualforce自定义组件,它从visualforce页面获取一个属性。我需要在控制器的构造函数中访问该属性,以便从数据库中获取一些记录,并且需要在组件中显示这些记录。但问题是我并没有在控制器中获得属性值 请参阅下面的代码以清楚地了解问题 控制器: public with sharing class AdditionalQuestionController { public String CRFType {get;set;} public Addition

我正在尝试开发一个visualforce自定义组件,它从visualforce页面获取一个属性。我需要在控制器的构造函数中访问该属性,以便从数据库中获取一些记录,并且需要在组件中显示这些记录。但问题是我并没有在控制器中获得属性值

请参阅下面的代码以清楚地了解问题

控制器:

public with sharing class AdditionalQuestionController {
    public String CRFType {get;set;}
    public AdditionalQuestionController () {
        system.debug('CRFType : '+CRFType);
        List<AdditoinalQuestion__c> lstAddQues = [Select AddQues__c from AdditoinalQuestion__c wehre CRFType = :CRFType];
        system.debug('lstAddQue : '+lstAddQue);
    }
}
public与共享类AdditionalQuestionController{
公共字符串CRFType{get;set;}
公共附加问题控制器(){
system.debug('CRFType:'+CRFType);
List lstadques=[从AdditoinalQuestion_uuc wehre CRFType=:CRFType中选择AddQues_uuuc];
system.debug('lstadque:'+lstadque);
}
}
组成部分:

<apex:component controller="AdditionalQuestionController" allowDML="true">
    <apex:attribute name="CRFType" description="This is CRF Type."  type="String" required="true" assignTo="{!CRFType}" />
        <apex:repeat value="{!lstAddQue}" var="que">
            {!que}<br />
        </apex:repeat>
</apex:component>

{!que}
VisualForce页面:

 <apex:page >
    <c:AdditionalQuestionComponent CRFType="STE" />
</apex:page>

谢谢,
不幸的是,在构造函数返回后,VF组件中属性上的Vivek设置器方法似乎被调用。以下是控制器的另一种解决方案,它使用getter方法填充列表(设置CRFType成员变量后将调用该列表):

public与共享类AdditionalQuestionController{
公共字符串CRFType{set;}
公共附加问题控制器(){
system.debug('CRFType:'+CRFType);//此值在构造函数中为null
}
公共列表getlstadque(){
system.debug('CRFType:'+CRFType);//现在将设置此选项
List lstadques=[从AdditoinalQuestion_uuc wehre CRFType=:CRFType中选择AddQues_uuuc];
system.debug('lstadque:'+lstadque);
返回lstadque;
}
}

我认为这里的问题是,您希望成员变量在构造函数中有一个值-问题是正在构造类的实例!它还不存在,因此不可能预先给非静态成员变量一个值


不要在构造函数中执行查询,而是为
lstadque
指定自己的getter,并在需要数据时在其中执行查询。当然,您可能希望缓存该值,以便不是每次都运行查询,而是从与此处不相关的事物的外观来看。

+1要解释为什么在构造函数之前不调用setter…我必须再要一些咖啡。我知道它已经在工作,但您(将来)可以使用另一个选项就是忽略在组件中包含控制器,而只是将属性作为实际类本身的一种类型传入。您可以将自定义Apex类实例直接传递到组件中,而无需为组件指定控制器。奇怪,但却是真的。然后,它将被视为与任何其他已实例化对象一样,具有可从组件内访问的所有公共属性和方法。但是,构造函数已经在组件中触发了一次。谢谢JCD,我一看到你的答案和代码示例就告诉你了!
public with sharing class AdditionalQuestionController {
    public String CRFType {set;}
    public AdditionalQuestionController () {
        system.debug('CRFType : '+CRFType); // this will be null in the constructor
    }
    public List<AdditoinalQuestion__c> getLstAddQue() {
        system.debug('CRFType : '+CRFType); // this will now be set
        List<AdditoinalQuestion__c> lstAddQues = [Select AddQues__c from AdditoinalQuestion__c wehre CRFType = :CRFType];
        system.debug('lstAddQue : '+lstAddQue);
        return lstAddQue;
    }
}