我正在尝试开发一个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
答案 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;
}
}