Highcharts,Yii和身体内容重新加载

时间:2014-06-30 13:45:15

标签: javascript php jquery yii highcharts

我有一个视图,可以在CListView和Highcharts图形中呈现一些数据。

请注意CListView的寻呼机按以下方式工作:它请求"新页面"服务器向服务器呈现页面的整个内容并将其发送到CListView。然后将正文替换为正在发送的内容,如下所示:$('body').html(rendered_html_response)

我也有dropDownList模仿这种行为。这是代码:

<?php
    echo CHtml::dropDownList('usage', 'cg', array(
        'd'=>'Daily',
        'm'=>'Monhly'
    ), array(
        'ajax'=>array(
            'type'=>'POST',
            'url'=>$this->createUrl('admin/user', array(
                'id'=>$user->id)
            ),
            'update'=>'body',
            'data'=>array('cg'=>'js:$(this).val()'), 
            'options'=>array(
                Yii::app()->session['cg']=>array(
                    'selected'=>true
                )
            )
        )
    ));
?>

无论如何,有一个问题。当我使用CListView时,一切正常(如:在不重新加载页面的情况下刷新页面的内容,正确呈现图表和数据等等),但是当我使用dropDownList选择一些内容,服务器呈现回复,将其发送到客户端,客户端开始替换body的内容,但后来我收到此错误:http://www.highcharts.com/errors/16

我尝试以这种方式停用highcharts.src.js

public function beforeAction(){
    if(Yii::app()->request->isAjaxRequest){
        Yii::app()->clientScript->scriptMap['highcharts.src.js'] = false;
    }
    return true;
}

然后我得到典型的undefined javascript错误(意味着某些正在尝试使用Highcharts,但未定义)。

问题出在哪里?我该如何解决?

2 个答案:

答案 0 :(得分:0)

//init
$('#container').highcharts({});
//select onchange
$('#container').highcharts().destroy();

答案 1 :(得分:0)

如下面的错误链接

  

页面中已定义的Highcharts

     

第二次在同一页面中加载Highcharts或Highstock时会发生此错误,因此已经定义了Highcharts命名空间。请记住Highcharts.Chart构造函数和Highcharts的所有功能都包含在Highstock中,因此如果您组合运行Chart和StockChart,则只需加载highstock.js文件。

您正在加载highcharts javascript两次。你可以尝试

a)在第一次加载时启用highcharts,然后在下一次加载时禁用它,例如可能检查是否ajax

b)使用自定义javascript检查是否已加载高级图表,如this blog post

c)使用为您处理js和css加载的NLSClientScript extension

我建议你使用最后一个。直到我发现它,我才被这个问题咬了几次。它消除了挑出每个javascript函数/文件的需要。

修改

您可以编辑代码以使用相同的update函数,而不是编辑listview js:

<?php
    echo CHtml::dropDownList('usage', 'cg', array(
        'd'=>'Daily',
        'm'=>'Monhly'
    ), array(
        'onChange'=>'$.fn.yiiListView.update("your-list-id", {
            data: {"usage":$(this).val()},
            type: "POST"
        });'
    ));
?>