繁体   English   中英

从 Visualforce 页面在 Controller 中设置值花费的时间太长

[英]Setting a value in Controller from Visualforce Page is taking too long

我正在使用 Visualforce Page 来显示一些选择字段,并根据我正在更新我的列表的选择。

<apex:form>
    <div class="map-controls">
        <div class="map-selects">
            <apex:selectList value="{!state}" multiselect="false" size="1">
                <apex:selectOptions value="{!states}"></apex:selectOptions>
                <apex:actionSupport event="onchange" rerender="countyList" />
            </apex:selectList>

            <apex:selectList value="{!county}" multiselect="false" size="1" id="countyList">
                <apex:selectOptions value="{!counties}"></apex:selectOptions>
            </apex:selectList>
        </div>

        <div class="map-search">
            <apex:commandButton value="Search" action="{!test}" rerender="productlistpanel" status="status" />
        </div>

        <div class="radio-btns">
            <apex:selectRadio value="{!type}">
                <apex:selectOptions value="{!types}" />
            </apex:selectRadio>
        </div>
    </div>
</apex:form>

基本上我在这里要做的是,当用户在单击命令按钮时选择 State、县和类型时,将呈现产品列表。

<apex:outputPanel id="productlistpanel">
    <div class="splide" role="group">
        <div class="splide__track">
            <ul class="splide__list">
                <apex:repeat value="{!products}" var="productKey" id="theRepeat">
                    <!-- REPEAT CONTENT -->
                </apex:repeat>
            </ul>
        </div>
    </div>
    
    <script>
    document.dispatchEvent(new CustomEvent("splideTest", { "detail": 'TEST' }));                    
    </script>
</apex:outputPanel>

这是我的 controller。

public List<SelectOption> getTypes() {
    RecordTypeInfo TYPE1 = Schema.SObjectType.Product2.getRecordTypeInfosByDeveloperName().get('TYPE1');
    RecordTypeInfo TYPE2 = Schema.SObjectType.Product2.getRecordTypeInfosByDeveloperName().get('TYPE2');

    List<SelectOption> options = new List<SelectOption>();
    options.add(new SelectOption(TYPE1.getRecordTypeId(), 'TYPE1'));
    options.add(new SelectOption(TYPE2.getRecordTypeId(), 'TYPE2'));

    return options;
}

public List<SelectOption> getStates() {
    List<SelectOption> options = new List<SelectOption>();
    options.add(new SelectOption('All', 'All'));

    List<State__c> states = [SELECT Id, 
                                Name
                            FROM State__c];

    for (State__c s : states) {
        options.add(new SelectOption(s.Name, s.Name));
    }

    return options;
}

public List<SelectOption> getCounties() {
    List<SelectOption> options = new List<SelectOption>();
    options.add(new SelectOption('All', 'All'));

    List<County__c> counties = new List<County__c>();

    if (state != null && state != 'ALL') {
        counties = [SELECT Id, 
                            State__c, 
                            Name
                    FROM County__c
                    WHERE State__r.Name = :state];
    }

    for (County__c c : counties) {
        options.add(new SelectOption(c.Name, c.Name));
    }

    return options;
}

public PageReference test() {
    return null;
}

public String state { get; set; }

public String county { get; set; }

public String type { get; set; }

public Map<Id, WRAPPER> productList { get; set; }

public Map<Id, WRAPPER> getProducts() {
    try {
        // CREATE QUERY
        query += String.isNotBlank(state) && state != 'ALL' ? ' AND State__c = \'' + state + '\'' : '';
        query += String.isNotBlank(county) && county != 'ALL' ? ' AND County__c = \'' + county + '\'' : '';
        query += String.isNotBlank(type)  ? ' AND RecordTypeId = \'' + type + '\'' : '';
        query += ' ORDER BY Name ASC';

        System.debug('query ' + query);
        List<Product2> productList = (List<Product2>)database.query(query);

        for (Product2 prod : productList) {
            // CREATE LIST
        }

        return returnMap;
    } catch (Exception ex) {
        ApexPages.Message msg = new ApexPages.Message(ApexPages.Severity.Error, ex.getMessage());
        ApexPages.addMessage(msg);
        return null;
    }
}

我的问题是当我输入 select 并点击搜索时; 该类型无法立即使用。 我可以看到正在执行重新渲染,并且在日志中我看到该类型未保存。 我必须再次单击“搜索”按钮才能看到我希望选择的类型。

我通常使用 Lightning Web 组件,我不处理此类问题,但不幸的是,我必须使用 VF Page 来实现此实现。

到目前为止我找不到任何解决方法,我试图了解延迟,但这似乎不是一个常见问题。 我认为这是我的设计问题。 我找不到为什么设置值不够快。

你有没有遇到过这种情况,或者你有什么建议吗?

你可以作弊,将它写在 LWC 中,然后使用“Lightning Out”来显示它。 省去了最终重写它的麻烦;)

我怀疑部分原因是只有第一个选择列表具有apex:actionSupport

您吞下异常(也许查询有问题)并使用addMessage - 但要真正显示您需要<apex:pageMessages id="messages" />标记,然后将其添加到您的重新渲染( rerender="productlistpanel,messages"

您的“类型” 选择列表 收音机是唯一没有后备“全部”的收音机。 我怀疑在 UI 中似乎将 type1 选择为第一个条目,但实际上该值是 null,因为您没有在 controller 中初始化它? 例如,如果您在构造函数中明确设置它,看看它是否表现得更好。

soql 注入的 Risko(可以使用绑定变量,即使在动态 soql 中),您可以阅读有关<apex:actionRegion>的此类部分表单提交。 无耻插件: https://salesforce.stackexchange.com/a/22216/799

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM