无法将Component属性与控制器绑定

时间:2012-07-19 11:12:23

标签: salesforce apex-code visualforce

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

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

控制器:

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);
    }
}

组件:

<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>

VisualForce页面:

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

谢谢,     的Vivek

2 个答案:

答案 0 :(得分:4)

我认为这里的问题是你期望成员变量在构造函数中有一个值 - 障碍是正在构造类的实例!它还不存在,因此无法为非静态成员变量赋予先验值。

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

答案 1 :(得分:2)

不幸的是,在构造函数返回后,似乎会调用VF组件中属性的Setter方法。这是您的控制器的替代解决方案,它使用getter方法填充列表(在设置CRFType成员变量之后调用):

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;
    }
}