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

Viv*_*vek 5 salesforce visualforce apex-code

我正在尝试开发一个Visualforce自定义组件,该组件从Visual Force页面获取属性。我需要在控制器的构造函数中访问该属性,以便可以从数据库中获取一些记录,并且需要在组件中显示这些记录。但是问题是我没有在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

零件 :

<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>
Run Code Online (Sandbox Code Playgroud)

VisualForce页面:

 <apex:page >
    <c:AdditionalQuestionComponent CRFType="STE" />
</apex:page>
Run Code Online (Sandbox Code Playgroud)

谢谢,Vivek

Mat*_*cey 5

我相信这里的问题是,您期望成员变量在构造函数中具有一个值-缺点是正在构造类的实例!它尚不存在,因此无法为非静态成员变量赋予优先值。

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

  • 我意识到它已经在工作,但是(将来)您可以使用的另一种选择是忽略组件中包含的控制器,而只是将属性作为实际类本身的类型传递。您可以将自定义Apex类实例直接传递到组件中,而无需为组件指定控制器。奇怪-但事实如此。然后将其视为具有已从组件内部访问的所有公共属性和方法的任何其他已实例化对象。但是,构造函数将已经在组件中触发一次。 (2认同)

JCD*_*JCD 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;
    }
}
Run Code Online (Sandbox Code Playgroud)