Salesforce:Javascript 不想重新渲染(经过 Chrome 测试)

Posted

技术标签:

【中文标题】Salesforce:Javascript 不想重新渲染(经过 Chrome 测试)【英文标题】:Salesforce: Javascript do not want to rerender (chrome tested) 【发布时间】:2014-02-23 23:45:27 【问题描述】:

我遇到了一个我无法解决的问题。确实,我有带有 apex 变量的 JS,我想重新渲染这个块以获取新的值。我正在使用输出面板,但不幸的是没有重新渲染发生。我的代码如下

<apex:commandButton value="button" id="theButton" action="!setDataSet" oncomplete="refreshMyChart()" rerender="jstorerender"/>
    <apex:outputpanel id="jstorerender"> 
        <script type="text/javascript" >
            $j = jQuery.noConflict(); 
            var innerVar = '!innerString'; 
            var covVar = '!coverageAsCategorie';
            console.log("want to refreshINIT"+innerVar+covVar);
        </script>   
     </apex:outputpanel>

刷新我的图表功能有点复杂,所以我把它放在另一个块中,因为我认为这不是问题的根源,因为重新渲染应该发生在 oncomplete 之前:

<script type="text/javascript">
    function refreshMyChart()
            console.log("want to refreshINIT2"+innerVar+covVar);
            var chart;
            var colors = Highcharts.getOptions().colors;
            var categories = ['!coverageAsCategorie'];
            var name = 'Browser brands';
            var data = ['!innerString'];

            function setChart(options) 
               chart.series[0].remove(false);
               chart.addSeries(
                   type: options.type,
                   name: options.name,
                   data: options.data,
                   color: options.color || 'white'
               , false);
               chart.xAxis[0].setCategories(options.categories, false);
               chart.redraw();
            ;
            chart = new Highcharts.Chart(
                    chart: 
                        renderTo: 'container',
                        inverted:true

                    ,
                    title: 
                        text: 'Browser market share, April, 2011'
                    ,
                    subtitle: 
                        text: 'Click the columns to view versions. Click again to view brands.'
                    ,
                    xAxis: 
                        categories: categories
                    ,
                    yAxis: 
                        title: 
                            text: 'Total percent market share'
                        
                    ,
                    plotOptions: 
                        series: 
                            cursor: 'pointer',
                            point: 
                                events: 
                                    click: function() 
                                        var drilldown = this.drilldown;
                                        var options;
                                        if (drilldown)  // drill down
                                            options = 
                                                'name': drilldown.name,
                                                'categories': drilldown.categories,
                                                'data': drilldown.data,
                                                'color': drilldown.color,
                                                'type': 'columnrange',
                                            ;
                                         else  // restore
                                            options = 
                                                'name': name,
                                                'categories': categories,
                                                'data': data,
                                                'type': 'pie'
                                            ;
                                        
                                        setChart(options);
                                    
                                
                            ,
                            dataLabels: 
                                enabled: true,
                                color: colors[0],
                                style: 
                                    fontWeight: 'bold'
                                ,
                                formatter: function() 
                                    return this.y +'%';
                                
                            
                        
                    ,
                    tooltip: 
                        formatter: function() 
                            var point = this.point,
                                s = this.x +':<b>'+ this.y +'% market share</b><br/>';
                            if (point.drilldown) 
                                s += 'Click to view '+ point.category +' versions';
                             else 
                                s += 'Click to return to browser brands';
                            
                            return s;
                        
                    ,
                    series: [
                        type: 'pie',
                        name: name,
                        data: data,
                        color: 'white'
                    ],
                    exporting: 
                        enabled: false
                    
            );

    ;</script>

当我点击我的按钮时会发生什么? :

我的刷新函数里面的console.log出现了(那我猜是触发了oncomplete事件) 我的输出面板块中的console.log 不显示。然后我认为重新渲染存在问题。加上页面加载时 console.log IS 显示所以我认为这里的代码没有任何问题......

而且没有触发JS错误。那我真的不明白为什么rerender不想操作。

知道这里发生了什么吗?

谢谢各位 :)

【问题讨论】:

【参考方案1】:

从重新渲染的输出面板中调用 refreshMyCart。

【讨论】:

以上是关于Salesforce:Javascript 不想重新渲染(经过 Chrome 测试)的主要内容,如果未能解决你的问题,请参考以下文章

在没有用户名和密码的情况下授权 Salesforce REST API

如何在 Salesforce 中重命名我的 Apex 类名称

Salesforce REST API 登录?

Salesforce OAuth 与 REST API 使用 Javascript

如何使用 Javascript 或 JQuery 从 Salesforce1 应用程序导航到 iOS 13 中的其他本机应用程序?

salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)